如何从另一个文件读取管道输入?
How to read pipe input from another file?
在我的程序 (main.c) 中,我 fork 了一个进程,然后我需要通过管道将数据发送到子进程。在 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);
您正在同一个套接字上读取和写入。
使用 socketpair(2)
创建一对套接字允许您进行双向通信,以便从第二个套接字读取写入第一个套接字的数据,反之亦然。
这里fd[0]
指的是父进程和子进程中的同一个套接字,所以父进程写入第一个套接字,子进程试图从同一个套接字读取。父写入的数据将出现在第二个套接字上,在本例中为fd[1]
。
所以你需要做:
dup2(fd[1], 0); // make stdin of the child refer to the *second* socket
和
char data[11] = {'[=11=]'}; // make sure to allocate space
read(STDIN_FILENO, data, sizeof(data) - 1);
在我的程序 (main.c) 中,我 fork 了一个进程,然后我需要通过管道将数据发送到子进程。在 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);
您正在同一个套接字上读取和写入。
使用 socketpair(2)
创建一对套接字允许您进行双向通信,以便从第二个套接字读取写入第一个套接字的数据,反之亦然。
这里fd[0]
指的是父进程和子进程中的同一个套接字,所以父进程写入第一个套接字,子进程试图从同一个套接字读取。父写入的数据将出现在第二个套接字上,在本例中为fd[1]
。
所以你需要做:
dup2(fd[1], 0); // make stdin of the child refer to the *second* socket
和
char data[11] = {'[=11=]'}; // make sure to allocate space
read(STDIN_FILENO, data, sizeof(data) - 1);