免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2959 | 回复: 8

为什么我的wait(&status)卡死了,没有任何响应? [复制链接]

论坛徽章:
0
发表于 2010-09-01 17:51 |显示全部楼层
10可用积分
本帖最后由 kgisme170 于 2010-09-01 19:08 编辑

我在sun平台上编辑这个函数,功能流程是
1. 父进程打开一个命名管道,等待子进程;
2. 子进程写入,关闭。
3. 父进程读出,关闭。
发现父进程和子进程都不能响应,加了write打印一条消息也不行:
  1. #include<unistd.h>
  2. #include<fcntl.h>
  3. #include<sys/types.h>
  4. #include<sys/stat.h>
  5. #include<sys/wait.h>
  6. int main(void){
  7.   char FIFO[]=".myfifo";
  8.   char msg[8]="hello!\n";
  9.   char buf[8]={0};
  10.   unlink(FIFO);
  11.   mkfifo(FIFO,0666);
  12.   pid_t pid=fork();
  13.   int status;
  14.   if(pid>0){//father
  15.     write(STDOUT_FILENO,buf,sizeof(buf));//debug
  16.     wait(&status);
  17.     int fd=open(FIFO,O_RDONLY);
  18.     read(fd,buf,sizeof(buf));
  19.     write(STDOUT_FILENO,buf,sizeof(buf));
  20.     close(fd);
  21.   }else{//child
  22.     write(STDOUT_FILENO,buf,sizeof(buf));//debug
  23.     int fd=open(FIFO,O_WRONLY);
  24.     write(fd,msg,sizeof(msg));
  25.     close(fd);
  26.   }
  27.   return 0;
  28. }
复制代码
这是为什么? wait函数的调用方法有错么?

最佳答案

论坛徽章:
0
发表于 2010-09-01 17:51 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2010-09-01 18:57 |显示全部楼层
请教!!!!!

论坛徽章:
0
发表于 2010-09-01 19:12 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2010-09-01 19:18 |显示全部楼层
把read和write的返回值打出来看看

论坛徽章:
0
发表于 2010-09-01 19:23 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2010-09-01 19:26 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2010-09-01 20:51 |显示全部楼层
回复 1# kgisme170


    不是wait(&status)卡死的
而是管道在阻塞模式打开写端时,如果读端没有打开的话,会阻塞到打开写端的那里,所以你的程序阻塞在23行的:int fd=open(FIFO,O_WRONLY);了
解决办法是:将17行的  int fd=open(FIFO,O_RDONLY);放到16行前
就可以了

论坛徽章:
0
发表于 2010-09-01 21:56 |显示全部楼层
是死锁了。子进程等待父进程打开管道,父进程等待子进程退出,

把open放到wait前面。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP