免费注册 查看新帖 |

Chinaunix

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

这个程序究竟那部分才是子进程? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-05-05 23:38 |只看该作者 |倒序浏览
  请各位达人帮忙思考一下这个程序代码,究竟我错在哪里?
  程序中创建一个子进程,实现计时,当到达目标时间后,改变timeout值,以通知主进程,并且由主进程结束子进程。

  1.         int istimechange=1, timeout=0, time=4,ischildexsite=0;
  2.         pid_t pid;

  3.         while (1)
  4.         {
  5.                 if (ischildexsite==0)
  6.                 {
  7.                         ischildexsite=1;
  8.                         pid=fork();
  9.                 }
  10.                 if (pid==0 && ischildexsite==1)
  11.                 {
  12.                         ischildexsite=2;
  13.                         printf("create childprocess\n");
  14.                         printf("child pid:%d\n", getpid());
  15.                         sleep(time);
  16.                         timeout=1;
  17.                 }
  18.                 else
  19.                 {
  20.                         if (timeout==1)
  21.                         {
  22.                                 printf("wait childprocess\n");
  23.                                 printf("pid:%d, ppid:%d\n", pid, getpid());
  24.                                 printf("wait result:%d\n", waitpid(pid, NULL, 0));
  25.                                 return 1;
  26.                         }
  27.                 }
  28.         }
  29. }
复制代码


可是结果却很奇怪程序输出
create childprocess(1)
child pid:20563(1)
wait childprocess(2)
pid:0, ppid:20563(2)
wait result:-1(2)

也就是说,主进程也变成了子进程。
后来将主进程中if判断中的timeout==1改成timeout==0,并且去除子进程中timeout的赋值,父子进程就变成这样了。第一次循环正确,第二次主进程又变成了子进程……返回结果为:
create childprocess(1)
child pid:21101(1)
wait childprocess(1)
pid:21101 ppid:21100(1)
wait childprocess(2)
pid:0 ppid:21101(2)
wait result:-1(2)
wait result:21101(1)

(1)表示是第一次循环输出内容,(2)则是第二次输出内容。   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2005-05-06 10:15 |只看该作者

这个程序究竟那部分才是子进程?

没有看到 1122 啊...

论坛徽章:
0
3 [报告]
发表于 2005-05-06 15:04 |只看该作者

这个程序究竟那部分才是子进程?

1122是后来自己加上去的,
后来为了方便检查,
又在while(1)后面定义了一个自加的变量,
在每句printf中输出这个变量,就变成上面的了。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2005-05-06 15:21 |只看该作者

这个程序究竟那部分才是子进程?

oh!my god!
看来你还没搞明白fork()是啥东西...
你看到的东西全是子进程打印出来的,父进程在死循环中,啥也没做

论坛徽章:
0
5 [报告]
发表于 2005-05-06 15:35 |只看该作者

这个程序究竟那部分才是子进程?

我想我大概找到问题所在了,概念弄错了。
我希望子进程中修改的变量在父进程中能够读取,但是实际上父进程和子进程中的变量是无关的。看来要设置全局变量啊。

论坛徽章:
0
6 [报告]
发表于 2005-05-06 15:38 |只看该作者

这个程序究竟那部分才是子进程?

或者使用共享存储
真是大失误啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP