В моей программе (main.c) я разветвляю процесс, а затем мне нужно отправить данные через канал в дочерний процесс. После системного вызова execl дочерний процесс продолжает свою жизнь в файле process.c. Установив стандартный ввод этого дочернего элемента в дескриптор файла его родителя, я пытаюсь отправить данные из родительского процесса в дочерний процесс. Но дочерний процесс не может получить никаких входных данных, и я не мог понять, почему возникает эта проблема. Спасибо заранее.
main.c
#define PIPE(fd) socketpair(AF_UNIX, SOCK_STREAM, PF_UNIX, fd)
...
char* data="data";
int fd[2];
PIPE(fd);
write(fd[0],data,sizeof(data));
if(fork()==0){
dup2(fd[0],0);
close(fd[0]);
close(fd[1]);
execl("process","process",x,y,0);}
процесс.с
...
char* data;
read(0,data,10);
printf("%s\n",data);
fd[0]
— конец канала для чтения. Вы пишете ему в родительском процессе и читаете с того же конца в дочернем процессе. Кроме того, вы записываете в него перед вызовомdup2
, то есть в этот момент вы не записываете в стандартный вывод. - person bnaecker   schedule 15.03.2018PIPE
? Это создание пары каналов, пары сокетов или какого-либо другого механизма двунаправленной связи? - person bnaecker   schedule 15.03.2018fd[0]
. Данные, записанные наfd[0]
, будут считаны сfd[1]
и наоборот. Кроме того, вам нужно выделить некоторое пространство, используя что-то вродеchar* data = malloc(10);
в дочернем процессе, иначе вы читаете данные в неопределенную область памяти. - person bnaecker   schedule 15.03.2018