当前位置: 技术问答>linux和unix
初学管道实现时的阻塞问题~
来源: 互联网 发布时间:2016-01-31
本文导语: [code] #include #include main(){ int pipe_fd[2]; pid_t pid; char r_buf[4]; char* w_buf; int writenum; int cmd; memset(r_buf,0,sizeof(r_buf)); if(pipe(pipe_fd)0) { sleep(1); close(pipe_fd[0]); write w_buf="111"; if((writenum=write(pipe_fd[1],w_b...
[code]
#include
#include
main(){
int pipe_fd[2];
pid_t pid;
char r_buf[4];
char* w_buf;
int writenum;
int cmd;
memset(r_buf,0,sizeof(r_buf));
if(pipe(pipe_fd)0)
{
sleep(1);
close(pipe_fd[0]);
write w_buf="111";
if((writenum=write(pipe_fd[1],w_buf,4))==-1)
printf("write to pipe errorn");
else
printf("the bytes write to pipe is %d n", writenum);
close(pipe_fd[1]);
}
}
//上面将发生 Broken Pipe
#include
#include
main(){
int pipe_fd[2];
pid_t pid;
char r_buf[4];
char* w_buf;
int writenum;
int cmd;
memset(r_buf,0,sizeof(r_buf));
if(pipe(pipe_fd)0)
{
sleep(1);
close(pipe_fd[0]);
write w_buf="111";
if((writenum=write(pipe_fd[1],w_buf,4))==-1)
printf("write to pipe errorn");
else
printf("the bytes write to pipe is %d n", writenum);
close(pipe_fd[1]);
}
}
#include
#include
main(){
int pipe_fd[2];
pid_t pid;
char r_buf[4];
char* w_buf;
int writenum;
int cmd;
memset(r_buf,0,sizeof(r_buf));
if(pipe(pipe_fd)0)
{
sleep(1);
close(pipe_fd[0]);
write w_buf="111";
if((writenum=write(pipe_fd[1],w_buf,4))==-1)
printf("write to pipe errorn");
else
printf("the bytes write to pipe is %d n", writenum);
close(pipe_fd[1]);
}
}
//上面将发生 Broken Pipe
#include
#include
main(){
int pipe_fd[2];
pid_t pid;
char r_buf[4];
char* w_buf;
int writenum;
int cmd;
memset(r_buf,0,sizeof(r_buf));
if(pipe(pipe_fd)0)
{
sleep(1);
close(pipe_fd[0]);
write w_buf="111";
if((writenum=write(pipe_fd[1],w_buf,4))==-1)
printf("write to pipe errorn");
else
printf("the bytes write to pipe is %d n", writenum);
close(pipe_fd[1]);
}
}
|
你要记得fork之后父子的pipe_fd[0]或pipe_fd[1]必须都关闭才能真正关闭0或1
原因是二种情况下,子调用read函数阻塞,因为这时没有数据可读。父进程sleep(1)后向管道中写了4字节,然后关闭管道写描述符,然后子的read返回,关闭读,再睡10秒后退出。这时没有发生:向读端已关闭的pipe写的情况。
第一种情况下,子先关闭
close(pipe_fd[0]);
close(pipe_fd[1]);
sleep(10); //关闭管道两端后,sleep(10),
在子开始sleep的时候,父的sleep(1)才完成,然后close(pipe_fd[0]);至此pipe的读端真正被关闭了,然后的write就是一个写对端关闭的错误操作。
原因是二种情况下,子调用read函数阻塞,因为这时没有数据可读。父进程sleep(1)后向管道中写了4字节,然后关闭管道写描述符,然后子的read返回,关闭读,再睡10秒后退出。这时没有发生:向读端已关闭的pipe写的情况。
第一种情况下,子先关闭
close(pipe_fd[0]);
close(pipe_fd[1]);
sleep(10); //关闭管道两端后,sleep(10),
在子开始sleep的时候,父的sleep(1)才完成,然后close(pipe_fd[0]);至此pipe的读端真正被关闭了,然后的write就是一个写对端关闭的错误操作。