免费注册 查看新帖 |

Chinaunix

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

gcc编译通过后出现的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-04-25 09:12 |只看该作者
原帖由 MMMIX 于 2009-4-25 09:02 发表

真的?那一楼的结果是怎么来的?你现在在把你在四楼的代码重新编译一遍,然后直接执行四遍把结果贴上来我看看。


一楼的代码和四楼的代码是有区别的。
一楼的代码中:sleep(1)在printf前面,所以能保证每次执行都是严格交叉输出。(原理上是不是第一行输出child和parent都可以?因为父子进程是并发执行的。)
四楼的代码中:sleep(1)在printf后面,出来的结果都是象四楼这样的结果,我就想不明白了。为什么会这样?

论坛徽章:
0
12 [报告]
发表于 2009-04-25 09:13 |只看该作者
原帖由 MMMIX 于 2009-4-25 09:03 发表

只要 Shell 启动的进程(也就是这里的父进程)一结束,Shell 就会打印提示符。

嗯,这个问题明白了!也就是说一楼的问题我明白了。
但是四楼的问题我还没有明白。呵呵
谢谢!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
13 [报告]
发表于 2009-04-25 09:58 |只看该作者
原帖由 乌龙张 于 2009-4-25 09:12 发表

四楼的代码中:sleep(1)在printf后面,出来的结果都是象四楼这样的结果,我就想不明白了。为什么会这样?

你先从头试几次再说。BTW,你的代码我试过,结果跟你的还不一样。

论坛徽章:
0
14 [报告]
发表于 2009-04-25 10:09 |只看该作者
因为打印用的时间太少,所以结果差不多吧。

论坛徽章:
0
15 [报告]
发表于 2009-04-25 10:53 |只看该作者
原帖由 MMMIX 于 2009-4-25 09:03 发表

只要 Shell 启动的进程(也就是这里的父进程)一结束,Shell 就会打印提示符。


正解.父进程是由shell 调用的, 它最先退出,所以先打印提示符.字进程还没结束,继续打印.
把 sleep(1) 改成sleep(2)就会明白..!

论坛徽章:
0
16 [报告]
发表于 2009-04-25 16:10 |只看该作者

父进程和子进程的问题

程序1:
main()
{
int p1,i;
while ((p1=fork())==-1);
if (p1>0)
        for (i=0;i<5;i++)
        {
                printf("I am parent.\n");
                sleep(1);
        }
else
        for (i=0;i<5;i++)
        {
                printf("I am child.\n");
                sleep(1);
        }
}
程序1,反复执行多次,都是同样的结果:
I am child.
I am parent.
I am parent.
I am child.
I am parent.
I am child.
I am parent.
I am child.
I am parent.
I am child.

程序2:
main()
{
int p1,i;
while ((p1=fork())==-1);
if (p1>0)
        for (i=0;i<5;i++)
        {
          sleep(1);               
          printf("I am parent.\n");
          }
else
        for (i=0;i<5;i++)
        {
         sleep(1);      
         printf("I am child.\n");
         }
}
程序2反复执行多次,也都是同样的结果:
I am parent.
I am child.
I am parent.
I am child.
I am parent.
I am child.
I am parent.
I am child.
I am parent.
I am child.


问题1:程序1和程序2都是关于fork()的实验,父进程和子进程是并发执行,为什么我反复执行多次,程序1和程序2的输出结果都是不变的?按理说,程序1的结果有可能parent在前,程序2的结果有可能child在前。可是我执行了很多次,它们的结果都没有变过。这应该如何解释呢?
问题2:在程序1的结果中,前三行为什么会输出一行child输出二行parent?如何解释?
请版主不要给我合帖,这是新问题。
谢谢!

论坛徽章:
0
17 [报告]
发表于 2009-04-25 16:35 |只看该作者
楼主遇到的情况似乎可以这样解释:
现在我们使用的Shell可以同时运行一个前台作业和任意多个后台作业,每一个作业是我们在shell中执行的命令,比如
$fc-list | sort | less
这是一个前台作业,该作业中包含3个进程。

$fc-list | sort | less &
是一个后台作业
直观的说,运行一个前台作业的时候我们是不能与shell进行交互的,而运行后台作业的时候可以,也就是说能得到命令行提示符。

对于前台作业,Shell调用wait等待它们运行结束。一旦它们全部运行结束,Shell就调用tcsetpgrp函数将自己提到前台继续接受命令。但是对于楼主的情况,前台作业中的一个进程调用fork派生了一个子进程,shell是不知道这个子进程的,所以也不会调用wait等待它结束。一旦作业运行结束,Shell就把自己提到前台,如果原来的前台进程组还存在(这个子进程还没终止),则它自动变成后台进程组。这时我们可以使用shell,于此同时,子进程向终端打印,这就是楼主遇到的情况。

四楼的遇到的情况是十分正常的,多进程环境中的运行次序是很复杂的,不能简单的使用sleep来控制,可以使用互斥锁等控制执行次序。
参考资料: http://learn.akae.cn/media/ch34s02.html

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
18 [报告]
发表于 2009-04-25 16:41 |只看该作者
原帖由 乌龙张 于 2009-4-25 16:10 发表
程序1,反复执行多次,都是同样的结果:
I am child.
I am parent.
I am parent.
I am child.
I am parent.
I am child.
I am parent.
I am child.
I am parent.
I am child.

这个结果有人能重现么?

论坛徽章:
0
19 [报告]
发表于 2009-04-25 19:20 |只看该作者
原帖由 tiger_tnt 于 2009-4-25 16:35 发表
楼主遇到的情况似乎可以这样解释:
现在我们使用的Shell可以同时运行一个前台作业和任意多个后台作业,每一个作业是我们在shell中执行的命令,比如
$fc-list | sort | less
这是一个前台作业,该作业中包含 ...


明白点了,谢谢!你说的很详细。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP