【发布时间】:2018-03-15 19:05:37
【问题描述】:
在我的程序 (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);}
进程.c
...
char* data;
read(0,data,10);
printf("%s\n",data);
【问题讨论】:
-
fd[0]是管道的读取端。您在父进程中写入它并在子进程中从同一端读取。此外,您在dup2调用之前写入它,这意味着您此时没有写入标准输出。 -
我正在使用双向管道。
-
管道根据定义是单向的。
PIPE在做什么?这是创建一对管道、套接字对还是其他一些双向通信机制? -
编辑了我的问题...
-
您仍在同一个套接字
fd[0]进行读写操作。写入fd[0]的数据将从fd[1]读取,反之亦然。此外,您需要在子进程中使用char* data = malloc(10);之类的东西分配一些空间,否则您会将数据读入未定义的内存位置。