如何在循环中使用管道,这是正确的吗?

时间:2016-10-07 16:02:56

标签: c unix pipe fork posix

我想知道我对管道的使用是否正确,此代码位于fork()子进程中,而pfd是管道指针:

char buf[1024];
while(1){
    signal(SIGUSR1, OnSigUsr1);
    sleep(10000);
    if(get==1){
        get=0;
        close(pfd[1]);
        read(pfd[0], buf, sizeof(buf));
        close(pfd[0]);
    }
}

父代码中的另一段代码:

char buffer[1024];
/*put something in buffer*/
close(pfd[0]);
if(write(pfd[1], buffer, strlen(buffer))==-1){
     printf("error write\n");
};
close(pfd[1]);
kill(fpid,SIGUSR1);

我的问题是缓冲区可以写入并且只从fork()获取一次,下次它不能再次写入管道并返回error write。我想知道我是不是错了。感谢。

2 个答案:

答案 0 :(得分:1)

您只能将数据写入打开的文件描述符。父节点在写入缓冲区后执行close(pfd[1]);,并且在读取缓冲区后子节点执行close(pfd[0]);。如果要再次使用文件描述符,请不要关闭它,但在程序退出之前关闭所有打开的文件描述符。

答案 1 :(得分:0)

在管道的情况下,如果管道已满,写入块。

请注意,写入管道写入端的数据会在内核中缓冲,直到从管道的读取端读取。

child : pfd [1]可以在儿童中关闭,因为它不用于儿童。但是,如果儿童随后使用它,则不需要关闭pfd [0]。

parent :同样,pfd [0]可以在父级中关闭,因为它不在父级中使用。但是,如果父母随后使用它,则不需要关闭pfd [1]。