当前位置:  技术问答>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]); 
}
}

|
你要记得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就是一个写对端关闭的错误操作。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 初学 java 的朋友来和我交朋友,我也是初学。我的 QQ 号是 33555085
  • 又一个初学者的困惑!如果您是个大虾,请你一定要进来看看,指点迷津!如果您也是个初学者,那么您也一定要进来,也许我们有一样的遭遇!
  • 初学者的问题我是linux初学者,我想问一下在windows里下载的大于1.44M文件如何转移到linux分区里?
  • 我是个初学者,希望指点明津
  • 初学者用什么工具好?JBUILDER?JDK?
  • 对于初学者应该看什么样的java书籍
  • 初学java应该看那些书?
  • 初学linux看哪本书好?
  • 初学java,该看那些书,请朋友们指教
  • 我是初学者,该用什么java的“编译器”????
  • 初学java什么书好?
  • 对于初学者应该看什么样的书
  • 初学者:不是问题的问题?
  • 初学者这样检验自己的学习效果呢?
  • 初学JAVA,用哪个软件来调试和编译程序?
  • 初学者的问题??在线等待。
  • 各位高手大家好,我是初学LINUX想请教几个问题
  • 初学者的疑问
  • 从初学Linux到内核开发
  • 初学java的话,从何入手呢?vj++,还是jbuilder?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3