免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2139 | 回复: 5

[C] linux c 中关于fork的一个问题 [复制链接]

论坛徽章:
0
发表于 2014-09-12 19:13 |显示全部楼层
  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<stdlib.h>
  4. #include<signal.h>
  5. #include <sys/types.h>

  6. void handle(int signum);

  7. void handle(int signum)
  8. {
  9.         printf("child process execute\n");
  10. }

  11. int main()
  12. {
  13.         pid_t pd;
  14.         if((pd = fork()) == 0){
  15.                 //子进程执行
  16.                 printf("I am  child process\n");
  17.                 signal(SIGINT,handle);
  18.                 while(1);
  19.         }else{
  20.                 //父进程执行
  21.                 while(1){
  22.                         kill(pd,SIGINT);
  23.                         sleep(1);
  24.                 }
  25.         }
  26. }
复制代码
上面这段代码执行是没有结果的,
但是下面这段代码就可以了。
  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<stdlib.h>
  4. #include<signal.h>
  5. #include <sys/types.h>

  6. void handle(int signum);

  7. int main()
  8. {
  9.         pid_t pd;
  10.         if((pd = fork()) == 0){
  11.                 //子进程执行
  12.                 printf("I am  child process\n");
  13.                 signal(SIGINT,handle);
  14.                 while(1);
  15.         }else{
  16.                 //父进程执行
  17.                 while(1){
  18.                         kill(pd,SIGINT);
  19.                         sleep(1);
  20.                 }
  21.         }
  22. }
  23. void handle(int signum)
  24. {
  25.         printf("child process execute\n");
  26. }
复制代码
不知道为什么,难道是fork之拷贝fork()函数之后的父进程的数据和代码空间吗?,实在搞不懂。请大神帮忙看下。

论坛徽章:
0
发表于 2014-09-12 21:35 |显示全部楼层
路过,给你顶下,

论坛徽章:
6
酉鸡
日期:2013-11-04 15:30:02巳蛇
日期:2014-01-23 10:36:23双鱼座
日期:2014-01-23 13:08:332015亚冠之鹿岛鹿角
日期:2015-09-03 14:36:002015亚冠之武里南联
日期:2015-09-18 10:48:1315-16赛季CBA联赛之山西
日期:2016-05-05 00:05:33
发表于 2014-09-12 22:07 |显示全部楼层
本帖最后由 Dannysd 于 2014-09-12 22:07 编辑


     源码中就在main里加了个return 0; 运行结果如下:
  1. gcc test2.c
  2. [root@localhost ~]# ./a.out
  3. I am  child process
  4. child process execute
  5. child process execute
  6. child process execute
  7. child process execute
  8. (ctrl^c)
  9. [root@localhost ~]# child process execute

  10. [root@localhost ~]# gcc test.c
  11. [root@localhost ~]# ./a.out
  12. I am  child process
  13. child process execute
  14. child process execute
  15. child process execute
  16. (ctrl^c)
  17. [root@localhost ~]# child process execute

  18. [root@localhost ~]#
复制代码
test.c对应第一段代码,test2.c对应第二段代码

     环境
     gcc version 4.1.2 20080704 (Red Hat 4.1.2-54)

论坛徽章:
1
处女座
日期:2014-09-18 16:18:00
发表于 2014-09-13 00:20 |显示全部楼层
回复 1# zhangyifei216
不是你想的那样,你这样写程序考虑过竞态问题么,你怎么知道是子进程先执行还是父进程再执行?
如果父进程先执行,子进程还未捕获SIGINT就默认被退出了,哪来的结果。
你可以在父进程的while(1)前加一个sleep(1),你再跑,怎么都不会出问题了。

   

论坛徽章:
0
发表于 2014-09-13 20:21 |显示全部楼层
回复 4# Kasiotao


    谢谢你,昨天找到问题了,没来的急回复你。问题的答案就是像你描述的那样的。

论坛徽章:
0
发表于 2014-09-13 20:22 |显示全部楼层
回复 3# Dannysd


    不是这个问题,请参考你楼下的那位高手的回答
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP