2

假设我有一个父进程分叉一个子进程,写入子进程,然后等待从子进程读取某些内容,我可以用一个管道实现这个吗?它看起来像:

int main(){
    pid_t pid1;
    int pipefd[2];
    char data[]="some data";
    char rec[20]; 

    if(pipe(pipefd) == -1){
        printf("Failed to pipe\n");
        exit(0);
    }

    pid1 = fork();
    if(pid1<0){
         printf("Fork failed\n");
         exit(0);
    }else if(pid1==0){
        close(pipefd[1]);
        read(pipefd[0],rec,sizeof(rec));
        close(pipefd[0]);
        //do some work and then write back to pipe
        write(pipefd[1],data,sizeof(data));
    }else{
        close(pipefd[0]);
        write(pipefd[1],data,sizeof(data));
        close(pipefd[1]);
        //ignoring using select() for the moment.
        read(pipedfd[0],rec,sizeof(rec));
    }

在尝试了解更多信息时,手册页指出管道是单向的。这是否意味着当您创建管道以在父子之间进行通信时,写入管道的进程不能再读取它,而从管道读取的进程也不能再写入它?这是否意味着您需要两个管道来允许来回通信?就像是:

管道1:

P----阅读----->C

P<---写-----C

管道2:

P----写---->C

P<---读-----C

4

2 回答 2

4

不,根据定义,管道是单向的。问题是,如果没有任何同步,您将有两个进程从同一个文件描述符中读取。但是,如果您使用信号量,则可以执行类似的操作

S := semaphore initiated to 0.
P writes to pipe
P tries down on S (it blocks)
P reads from pipe

C reads from pipe
C writes to pipe
C does up on S (P wakes up and continues)

另一种方法是使用两个管道 - 更容易。

于 2013-04-12T08:06:07.630 回答
1

是否fildes[0]也可写和是否fildes[1]也可读未指定。

话虽如此,最简单的方法是使用两个管道。

另一种方法是通过管道指定子进程的文件描述符/名称/路径。在子进程中,您可以写入 中指定的文件描述符/名称/路径,而不是filedes[1]写入. filedes[1]

于 2013-04-12T08:13:27.733 回答