免费注册 查看新帖 |

Chinaunix

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

[C] fork的问题,为什么父进程ID消失了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-13 16:27 |只看该作者 |倒序浏览
父程序:nola:~ # cat parent.c
#include <unistd.h>
int main( void )
{
//  if(fork()==0)
        execlp("./child","child",NULL);
  while(1);
}

子程序:nola:~ # cat child.c
int main( void ){
      while(1);  
}

执行父程序:
nola:~ # ./parent &
[1] 19541

查看结果 :nola:~ # pstree 19541
child
nola:~ #

为什么父进程ID消失了呢?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2012-11-13 16:35 |只看该作者
你不是没有fork吗, 那父进程就跑child程序了啊, 哪有孩子?

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
3 [报告]
发表于 2012-11-13 16:55 |只看该作者
父进程ID没有消失,就是19541

execlp后面的就不会执行

论坛徽章:
0
4 [报告]
发表于 2012-11-13 17:01 |只看该作者
回复 2# linux_c_py_php


    查看结果 :nola:~ # pstree 19541
child
nola:~ #

有CHILD呀
但父ID不见了

再一个,怎么用GDB调试呢?
Breakpoint 1, main () at parent.c:4
4          if(fork()==0)
(gdb) n
Detaching after fork from child process 25459.
6          while(1);
(gdb) n
调到这一步,就不动了

论坛徽章:
0
5 [报告]
发表于 2012-11-13 17:11 |只看该作者
回复 3# yybmsrs


    nola:~ #  ./parent &
[1] 26179
nola:~ # ps -ef | grep child
root     26179 15250 99 17:04 pts/15   00:00:04 child
root     26185 15250  0 17:04 pts/15   00:00:00 grep child
nola:~ # ps -ef | grep pare
root     26191 15250  0 17:04 pts/15   00:00:00 grep pare
nola:~ #
父进程看不到了

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
6 [报告]
发表于 2012-11-13 17:15 |只看该作者
回复 5# nola_r


    看看execlp这个函数是什么意思,然后在执行这个之前把父进程pid打印出来看看

论坛徽章:
0
7 [报告]
发表于 2012-11-13 17:35 |只看该作者
回复 6# yybmsrs


    ossserver01:~ # ./parent &
[2] 28226
  the parent  process  is 28226 .

ossserver01:~ # ps -ef | grep pare
root     28240 15250  0 17:28 pts/15   00:00:00 grep pare
ossserver01:~ # ps -ef | grep chil
root     28226 15250 99 17:28 pts/15   00:00:22 child
root     28246 15250  0 17:29 pts/15   00:00:00 grep chil
child就是parent ,这是怎么回事呢

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
8 [报告]
发表于 2012-11-14 08:41 |只看该作者
os name? version?
if fork is imped as vfork, it is reasonable. or i don't know what happened

论坛徽章:
0
9 [报告]
发表于 2012-11-14 09:29 |只看该作者
回复 8# folklore

os version : SUSE Linux Enterprise Server 10 SP4  (x86_64)

    # cat parent.c
#include <unistd.h>
int main( void )
{
  if(vfork()==0)
{
  printf("the parent  process  is %d .\n", getpid());
while(1);
}
printf("the parent  process  is 123  .\n");
}

如果改成vfork,那printf("the parent  process  is 123  .\n");
这条应该是打印不出来的吧,因为子进程没有结束的话,父进程
会挂住,但我测试了并不是这样的
# ./parent
the parent  process  is 14300 .
the parent  process  is 123  .  ----这没有挂住
ossserver01:~ # ps -ef | grep chil
root     14300     1 99 09:28 pts/15   00:00:13 child

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
10 [报告]
发表于 2012-11-14 12:26 |只看该作者
回复 9# nola_r


#include <unistd.h>
int main( void )
{
  if(vfork()==0)
  {
     printf("the parent  process  is %d .\n", getppid());
     while(1);
  }
  printf("the parent  process  is 123  .\n");
  while(1); /*or wait();*/
  return 0; /*it is not impotant, but it is needed*/
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP