Могу ли я использовать файловый дескриптор, открытый процессом paren в потомке после вызова любой функции exec в C? - PullRequest
0 голосов
/ 02 февраля 2019

Предположим, у меня есть процесс p, который использует дескриптор файла, например, безымянный канал, для связи со своим родительским процессом p1.

Предположим, p вызывает fork(), чтобы создатьдочерний процесс c, который сразу после fork() вызывает одну из функций семейства exec.

По умолчанию дескрипторы файлов родительского элемента дублируются для дочернего элемента даже при использовании exec.Так что c должен иметь возможность общаться с p1, если его родитель p открыл дескриптор файла для p1.

Как мне получить этот дескриптор файла в исходном коде C c дочерний процесс, если переменная, соответствующая этому дескриптору файла, определена только в pp1)?

Просто для примера того, что я имею в виду, ниже приведен код для pи p1

//p1 process
int fd[2];
pipe(fd);
pid_t p_pid, c_pid;

p_pid = fork();
if(p_pid == 0) // p process
{
/* p_pid closes up input side of pipe */
    close(fd[0]);
    c_pid = fork();
    if (c_pid)==0 //c child process
    {
        exec("execution/child/process"...); 
    }
    else
    {
        ...// do p process parenting stuff      
    }

 }
 else
 {
     /* Parent p1 process closes up output side of pipe */
     close(fd[1]);
 }

Теперь "execution/child/process" имеет собственный исходный код, и я не могу использовать переменную fd для связи с p1, поскольку она не определена, но должен существовать файловый дескриптор:так как ссылаться на него и использовать его?

1 Ответ

0 голосов
/ 02 февраля 2019

По умолчанию дескрипторы файлов родителя дублируются для дочернего элемента даже при использовании exec.Так что c должен иметь возможность общаться с p1, если его родитель p открыл дескриптор файла для p1.

Да.Основным условием является то, что дескриптор файла не установлен близко к ex-exec.

Как я могу получить этот дескриптор файла в исходном коде C дочернего процесса c, если переменная, соответствующая этомудескриптор файла определяется только в pp1)?

  • Вы можете dup2() описатель файла на общеизвестный номер, такой как stdin (0), stdout (1), или stderr (2), или какой-либо другой номер, с которым согласуются родительский и дочерний коды.

  • Вы можете передать номер дескриптора файла ребенку какАргумент.

  • Вы можете записать число в файл, из которого впоследствии его читает ребенок.

  • Как особый случай предыдущего,Вы можете установить канал от родителя к стандартному входу ребенка и отправить номер ребенку по каналу.

Это не единственные возможности, но я думаю, что они охватывают всеиз самых простых и лучших.Хорошо заметьте, что первый является единственным, который не зависит от сотрудничества ребенка.

...