如何从另一个文件读取管道输入?

时间:2018-03-15 19:05:38

标签: c pipe execl

在我的程序(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);}

process.c

...

char* data;
read(0,data,10);
printf("%s\n",data);

1 个答案:

答案 0 :(得分:1)

你在同一个插座上阅读和写作。

使用socketpair(2)创建一对套接字允许您双向通信,以便从第二个套接字读取写在第一个套接字上的数据,反之亦然。

这里fd[0]引用父进程和子进程中的相同套接字,因此父进程正在写入第一个套接字,而子进程正在尝试从同一个套接字读取。父写入的数据将显示在第二个套接字上,在这种情况下为fd[1]

所以你需要这样做:

dup2(fd[1], 0); // make stdin of the child refer to the *second* socket

char data[11] = {'\0'}; // make sure to allocate space
read(STDIN_FILENO, data, sizeof(data) - 1);