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

How to using pipe in loop, is mine correct?

我想知道我对管道的使用是否正确,这段代码在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() 写入和获取一次,下次就不能再写入管道和 return error write。我想知道我是否把它弄错了。谢谢

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

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

请注意,写入管道write-end的数据在内核中缓冲,直到从管道read-end读取。

child : pfd[1] 可以在 child 中关闭,因为它没有在 child 中使用。但是,如果后续要被child使用,则不需要关闭pfd[0]。

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