免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: baozhao
打印 上一主题 下一主题

[函数] 关于Stevens 一书 system 函数的疑问 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-03-20 10:01 |只看该作者

回复 #8 思一克 的帖子

“fork()了许多孩子们.
然后执行system()”

system的实现指定了等待的pid
waitpid(pid, &status, 0)

所以即使先前 “fork()了许多孩子们.“,甚至这些孩子们都结束了,但是waitpid也不会等错啊

论坛徽章:
0
12 [报告]
发表于 2008-03-20 10:19 |只看该作者

回复 #11 思一克 的帖子

我似乎懂了,请确认我的想法对不对

(1)main 程序是父进程 它可能产生很多子进程,包括调用system产生的子进程

(2)父进程设置了SIG_CHLD的handler ,该handler里面设置了wait回收结束的子进程资源

(3)当system产生的子进程结束时,也产生SIG_CHLD,触发handler ,这样wait了system产生的子进程。
       但是该子进程是要在system里面被waitpid的,所以出现了问题。

非常感谢,这个问题困扰我几天了

论坛徽章:
0
13 [报告]
发表于 2008-03-20 10:23 |只看该作者
对了. 两种机制不能让他们乱了.

比如MAIN  fork了20个孩子. 自己有记数器,可以知道有几个完成了任务.
而后,调用了SYSTEM, 他要等SYSTEM返回再继续执行.
如果SYSTEM 谎报了, 那么main的waitpid和SIGCHLD function会被调用, 计数器是不乱了?


原帖由 baozhao 于 2008-3-20 10:19 发表
我似乎懂了,请确认我的想法对不对

(1)main 程序是父进程 它可能产生很多子进程,包括调用system产生的子进程

(2)父进程设置了SIG_CHLD的handler ,该handler里面设置了wait回收结束的子进程资源

( ...

论坛徽章:
0
14 [报告]
发表于 2008-03-20 10:25 |只看该作者
关键是你看的书将system()内部的fork waitpid罗列出来了, 十分舞蹈人的.

论坛徽章:
0
15 [报告]
发表于 2008-04-12 17:43 |只看该作者
我觉得这个问题还是没有讨论清楚。

楼主是说,在执行execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);时候,a.out进程先fork一个shell进程,然后由这个shell进程再fork一个子进程来执行cmdstring所指定的命令。这样,a.out的子进程是shell,shell的子进程是cmdstring。而2nd APUE书上(p342——343)确实也是这么说的。

但是,问题来了:

1、cmdstring进程结束时,内核应该发SIGCHLD给shell,而不是发给a.out,那又何来的“fool the caller of system into thinking that one of its own children terminated”呢?

2、在linux2.6.16下执行,确是看不到这个shell进程的,为何?(下面的程序为yqsys.c, 调用的是APUE 2nd p344实现的system函数)

int main()
{
    if (system("sleep 30") < 0)
    {
        printf("system error\n");
        exit(-1);
    }
    sleep(30);
}

$:gcc -o yqsys yqsys.c ../lib/libapue.a
$:./yqsys

在另一个bash查看结果:

13023 13031 13031 13031 pts/4    20146 Ss    1032   0:00      \_ -bash
13031 20146 20146 13031 pts/4    20146 S+    1032   0:00      |   \_ ./yqsys
20146 20147 20146 13031 pts/4    20146 S+    1032   0:00      |       \_ sleep 30

书上说的那个shell进程跑哪去了?


等待高人解释啊.......
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP