免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9483 | 回复: 13

子进程中如何获得system执行的PID [复制链接]

论坛徽章:
0
发表于 2010-02-07 17:20 |显示全部楼层
RT

论坛徽章:
0
发表于 2010-02-07 17:48 |显示全部楼层
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. use POSIX qw(:sys_wait_h);

  5. $SIG{CHLD} = \&sig_chld;

  6. sub sig_chld{
  7.     my $pid;

  8.     while (($pid = waitpid(-1, WNOHANG)) > 0) {
  9.         print STDERR "child terminated: $pid\n";
  10.     }
  11. }

  12. print "Parent PID: $\n";

  13. system("sleep 10");
复制代码
记得某unix教程上说的system(2)函数也是fork(2)和execl*(2)的组合(也许是我想当然了,但确实能这样实现)。
也就是说system是在子进程中执行的,等同于if (fork() == 0) {execl*()}了,子进程的状态,当然可以通过waitpid来得到。如上述代码。

执行上述代码,另开一个终端:
  1. ps ax -opid,ppid,comm
  2. 2163  1936 /usr/bin/perl ./test.pl (perl5.8.9)
  3. 2164  2163 sleep 10
复制代码
可以看到sleep 10的父进程是test.pl。
而等10秒结束,可以在原来终端窗口看到退出信息:
  1. Parent PID: 2180
  2. child terminated: 2181
复制代码
你可以通过waitpid来进行一些操作。详情可以仔细看waitpid。

论坛徽章:
0
发表于 2010-02-08 09:25 |显示全部楼层
我的意思是if (fork() == 0) {system()},我要获得这个system 执行的pid.

论坛徽章:
0
发表于 2010-02-08 12:30 |显示全部楼层
我的意思是if (fork() == 0) {system()},我要获得这个system 执行的pid.
arccos2002 发表于 2010-02-08 09:25


还不明白?
system(2)中包含了fork(2)了,system(2)可以看作是fork(2)和execl*(2)的组合。

你捕获子进程退出信号即可。

上述perl代码里的sig_chld()没有写原型,在C里就是void sig_chld(int signo);

论坛徽章:
0
发表于 2010-02-08 14:11 |显示全部楼层

  1. perldoc -f getpid
复制代码

论坛徽章:
0
发表于 2010-02-08 14:15 |显示全部楼层
本帖最后由 yigenjin 于 2010-02-08 14:19 编辑

回复 5# churchmice


getpid应该是属于POSIX::getpid:perldoc POSIX

getpid返回的是当前进程的pid,不是system中shell命令的PID。

窃以为他的要求最好是使用:
  1. use POSIX qw(getpid);

  2. if (fork() == 0) {
  3.   my $pid = getpid;
  4.   exec();
  5. }
复制代码
或者想在父进程中得知的话:
if ((my $pid = fork()) != 0) {
    这里的$pid就是父进程中得到的子进程pid了
}

总之就这么个意思。千万别fork后再system,那样执行的就是孙进程了。

一句话,system()隐含了fork。

论坛徽章:
0
发表于 2010-02-08 14:33 |显示全部楼层
回复  churchmice


getpid应该是属于POSIX::getpid:perldoc POSIX

getpid返回的是当前进程的pid, ...
yigenjin 发表于 2010-02-08 14:15



额,看错了,感谢指正

论坛徽章:
0
发表于 2010-02-08 14:42 |显示全部楼层
回复 6# yigenjin


    我现在就是要获得孙子进程的PID。本来exec和system的机制就不一样

论坛徽章:
0
发表于 2010-02-08 14:48 |显示全部楼层
回复 8# arccos2002

既然知道了syetem的机制,为什么还要使用system?
除非捕获子进程退出信号我也想不出别的思路在执行时就获取到,我认为是那是由于system的机制你无法在那时获取到的。

不过还有人人都会不是思路的思路。

system()里加一句:echo $$ > cmd.pid

回头主程序再去读cmd.pid吧

论坛徽章:
0
发表于 2010-02-08 14:50 |显示全部楼层
本帖最后由 arccos2002 于 2010-02-08 14:54 编辑

不就是就system产生的pid大家一起探讨下嘛
另system()里加一句:echo $$ > cmd.pid
这种方法貌似也是错的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP