我想知道我对管道的使用是否正确,此代码位于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
。我想知道我是不是错了。感谢。
答案 0 :(得分:1)
您只能将数据写入打开的文件描述符。父节点在写入缓冲区后执行close(pfd[1]);
,并且在读取缓冲区后子节点执行close(pfd[0]);
。如果要再次使用文件描述符,请不要关闭它,但在程序退出之前关闭所有打开的文件描述符。
答案 1 :(得分:0)
在管道的情况下,如果管道已满,写入块。
请注意,写入管道写入端的数据会在内核中缓冲,直到从管道的读取端读取。
child :
pfd [1]可以在儿童中关闭,因为它不用于儿童。但是,如果儿童随后使用它,则不需要关闭pfd [0]。
parent :
同样,pfd [0]可以在父级中关闭,因为它不在父级中使用。但是,如果父母随后使用它,则不需要关闭pfd [1]。