我想知道管道的用法是否正确,此代码在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。我想知道我是否把它弄错了。谢谢。

最佳答案

对于管道,如果管道已满,则写入会阻塞。

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

child : pfd [1]可以在子级中关闭,因为未在子级中使用它。但是,如果子进程随后使用pfd [0],则不需要关闭pfd [0]。

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

关于c - 如何使用管道循环,我的正确吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39921501/

10-11 06:32