Как использовать файловый дескриптор в дочернем процессе после execvp? - PullRequest
2 голосов
/ 03 апреля 2019

Я пытаюсь открыть дочерний процесс с помощью fork (), а затем выполнить execvp () - в другую программу. Я также хочу, чтобы родительский процесс и дочерний процесс связывались друг с другом с помощью канала.

вот родительский процесс -

int pipefds[2];
pipe(pipefds); // In original code I check for errors...
int readerfd = pipefds[0];
int writerfd = pipefds[1];

if(pid == 0){
    // Child
    close(readerfd);
        execvp("./proc2",NULL);
}


в программе 'proc2' я пытаюсь получить доступ к writerfd следующим образом-

write(writerfd, msg, msg_len);

но вместо этого я получаю ошибку времени компиляции - msgstr "ошибка: d writerfd" не объявлен (первое использование в этой функции); "

почему это? Я прочитал здесь о переполнении стека, что «дескрипторы открытых файлов сохраняются при вызове exec». ссылка . разве я не смогу связаться с writerfd, если это так?

как я могу записать в этот файловый дескриптор дочерний процесс после использования execvp? Как правильно сделать это и где я могу прочитать об ответе (я смотрел, но я не нашел ..)?

Спасибо!

1 Ответ

4 голосов
/ 03 апреля 2019

Дескрипторы открытого файла сохраняются при вызове функции exec.То, что не сохраняется, это имена любых переменных, используемых для их хранения.

Вам необходимо продублировать дескриптор файла с известным номером дескриптора файла, на который может ссылаться другая программа.Поскольку дочерний процесс пишет, вы должны скопировать дочерний конец канала в файловый дескриптор 1, который имеет тип stdout:

int pipefds[2];
pipe(pipefds);
int readerfd = pipefds[0];
int writerfd = pipefds[1];

if(pid == 0){
    // Child
        close(readerfd);
        dup2(writerfd, 1);
        execvp("./proc2",NULL);
}

Затем proc2 может записать в файловый дескриптор 1:

write(1, msg, msg_len);

Или, если сообщение является строкой, просто используйте printf

printf("%s", msg);
fflush(stdout);
...