【问题标题】:How to read pipe input from another file?如何从另一个文件中读取管道输入?
【发布时间】: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); 之类的东西分配一些空间,否则您会将数据读入未定义的内存位置。

标签: c pipe execl


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多