免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1385 | 回复: 4
打印 上一主题 下一主题

进程间通信问题!!!求解~~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-21 18:53 |只看该作者 |倒序浏览
描述:
fork 之后.. 父进程检查状态..while循环等待子进程的状态...子进程则进行 mysqldump备份数据库...子进程备份完成后 将system 返回值通过管道发给父进程..父进程读句柄得到后 则判断返回值..

部分代码:
  1.        pipe(PARENT_READ,CHILD_WRITE);  
  2.                 if(my $pid = fork) {
  3.                         close(CHILD_WRITE);
  4.                         my $child_return;
  5.                         print "db_connect(...,...,...,...)\n";
  6.                         print "Parent:$\n";

  7.                         while(!sysread(PARENT_READ,$child_return,10)) {   //循环等待子进程,子进程无通知则进入循环.. 问题也就出现在这...父进程一直等待子进程..阻塞...
  8.                                 print "checking...\n";
  9.                                 sleep(5);
  10.                         }   

  11.                         print "db_con->disconnect!\n";
  12.                         $back_status = $child_return;
  13.                         print $back_status."\n";
  14.                 }else {
  15.                         if(!defined $pid) {
  16.                                 print "**Error: can't fork.\n";
  17.                                 print " EXEC Mail_Send function....\n";
  18.                         }   
  19.                         print "CHild:$\n";   
  20.                         close(PARENT_READ);
  21.                         $back_status = system("mysqldump -u root -p'taofang' test t > /tmp/t.sql");
  22.                         sleep(10);
  23.                         print CHILD_WRITE $back_status;
  24.                         exit(0);   
  25.                 }   
复制代码

论坛徽章:
1
子鼠
日期:2013-12-02 22:34:22
2 [报告]
发表于 2012-12-21 22:14 |只看该作者
db_connect(...,...,...,...)
Parent:
CHild:
db_con->disconnect!
0
我的RHEL6.3 可以出来结果。也有/tmp/t.sql产生。不过有个疑问是sysread读不到的话不会阻塞,应该立即返回。但为什么没有打印checking...呢

论坛徽章:
0
3 [报告]
发表于 2012-12-21 22:58 |只看该作者
回复 2# erpeng_1988


    这也是我的疑问... 当子进程没有通信时也就是sysread 没读到东西时...父进程会阻塞...我想要的是不阻塞..进入下面的checking代码..要不然的话 这个fork 也就没意义了...

论坛徽章:
1
子鼠
日期:2013-12-02 22:34:22
4 [报告]
发表于 2012-12-23 22:00 |只看该作者
回复 3# klathleen
use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
 $flags = fcntl(REMOTE, F_GETFL, 0)
                               or die "Can’t get flags for the socket: $!\n";
 $flags = fcntl(REMOTE, F_SETFL, $flags │ O_NONBLOCK)
                               or die "Can’t set flags for the socket: $!\n";
可以拿fcntl指定不阻塞,结果如下:
db_connect(...,...,...,...)
Parent:
checking...
CHild:
checking...
checking...
db_con->disconnect!


   

论坛徽章:
0
5 [报告]
发表于 2012-12-24 10:44 |只看该作者
回复 4# erpeng_1988


    已解决..谢了....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP