如何在循环中使用管道,我的正确吗?
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],则不需要关闭它。
我想知道我对管道的使用是否正确,这段代码在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],则不需要关闭它。