fork调用产生的子进程,还能不能创建下一级的子进程?

时哲 2009-02-20 04:48:59
请指教,在LINUX系统的C语言程序里,我使用fork()调用在父进程中创建了一个子进程,那么,我能否再以子进程作为父进程去创建另一个子进程。我写的测试代码里是不行的,否则子子孙孙无穷匮也。想请教这是何机制?


if ((cld_pid = fork()) == 0) {
puts("儿子");
exit(0);
}
else
puts("老子");
...全文
596 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
时哲 2009-02-26
  • 打赏
  • 举报
回复
再来回报思想,感谢各位,终于明白了。原来fork()子进程是不会再执行fork()调用,而是从其后开始运行。弄清这一点就不用担心计划生育问题了。
yinbinux 2009-02-21
  • 打赏
  • 举报
回复
我的意思不是说只调用一个fock啊,在前一个fock点后还可以有fock啊,不知可以不 呵呵
challenge99 2009-02-20
  • 打赏
  • 举报
回复
pid_t pid;

if((pid = fork) < 0)
//error
else if(pid == 0)
{
if((pid = fork) < 0)
// error
if(pid == 0)
{
// secondary child
printf("secondary child.\n");
exit(0);
}

// first child
printf("first child.\n");
exit(0);
}

// fathter
printf("father.\n");
exit(0);

快乐田伯光 2009-02-20
  • 打赏
  • 举报
回复
子进程怎么会继续fork呢,子进程是从fork点后开始执行的, 怎么还是会fork呢?
[Quote=引用 12 楼 yinbinux 的回复:]
fock之后有两个返回值,返回0的是子程,父进程的PID是新创建的。把子进程继承很对父进程的特性,各自执行。子进程可以继续fock啊,返回0的还是子进程,呵呵,我是这么理解的,不知对不对~~~
[/Quote]
yinbinux 2009-02-20
  • 打赏
  • 举报
回复
fock之后有两个返回值,返回0的是子程,父进程的PID是新创建的。把子进程继承很对父进程的特性,各自执行。子进程可以继续fock啊,返回0的还是子进程,呵呵,我是这么理解的,不知对不对~~~
帅得不敢出门 2009-02-20
  • 打赏
  • 举报
回复
原始祖先为 init
独孤过儿 2009-02-20
  • 打赏
  • 举报
回复
debian:~# ps -aef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 23:41 ? 00:00:00 init [5]
root 2 1 0 23:41 ? 00:00:00 [migration/0]
root 3 1 0 23:41 ? 00:00:00 [ksoftirqd/0]
root 4 1 0 23:41 ? 00:00:00 [events/0]
root 5 1 0 23:41 ? 00:00:00 [khelper]
root 6 1 0 23:41 ? 00:00:00 [kthread]
root 9 6 0 23:41 ? 00:00:00 [kblockd/0]
root 10 6 0 23:41 ? 00:00:00 [kacpid]
root 71 6 0 23:41 ? 00:00:00 [kseriod]
root 111 6 0 23:41 ? 00:00:00 [pdflush]
root 112 6 0 23:41 ? 00:00:00 [pdflush]
root 113 6 0 23:41 ? 00:00:00 [kswapd0]
root 114 6 0 23:41 ? 00:00:00 [aio/0]
root 562 6 0 23:41 ? 00:00:00 [khubd]
root 635 6 0 23:42 ? 00:00:00 [scsi_eh_0]
root 928 6 0 23:42 ? 00:00:00 [kjournald]
root 1090 1 0 23:42 ? 00:00:00 udevd --daemon
root 1400 6 0 23:42 ? 00:00:00 [kgameportd]
root 1403 6 0 23:42 ? 00:00:00 [kpsmoused]
root 1663 6 0 23:42 ? 00:00:00 [kmirrord]
root 1919 1 0 23:42 ? 00:00:00 /sbin/syslogd
root 1930 1 0 23:42 ? 00:00:00 /sbin/klogd -x
root 1997 1 0 23:42 ? 00:00:00 /usr/sbin/acpid -c /etc/acpi/eve
root 2023 1 0 23:42 ? 00:00:00 /usr/sbin/sshd
root 2044 1 0 23:42 ? 00:00:00 /usr/sbin/cron
root 2068 1 0 23:42 tty1 00:00:00 /sbin/getty 38400 tty1
root 2084 1 0 23:42 ? 00:00:00 dhclient3 -pf /var/run/dhclient.
root 2091 2023 0 23:42 ? 00:00:00 sshd: root@pts/0
root 2093 2091 0 23:42 pts/0 00:00:00 -bash
root 2125 2093 0 23:46 pts/0 00:00:00 ps -aef

楼主自己看下吧,PPID是父进程,PID是子进程。其实都是“一个祖宗传下来”的,呵呵...
  • 打赏
  • 举报
回复
绝对可以。。因为linux下这么多进程,他们的都是1号进程fork出来的。
快乐田伯光 2009-02-20
  • 打赏
  • 举报
回复
可以啊,
我想楼主是没有理解你这里的儿子进程是从哪里开始运行吧.你的测试方案是不行的。
  • 打赏
  • 举报
回复
desiderata 2009-02-20
  • 打赏
  • 举报
回复
调用fork的进程就是父进程。父子进程在fork调用点以后执行的代码是一样的。
在子进程中再次调用fork,会再创建一个子进程。

Linux中所有的进程都是直接或间接从0号进程fork来的。
快乐田伯光 2009-02-20
  • 打赏
  • 举报
回复
10楼跟楼主都看一下我3楼的回复,你要明白fork一个进程后,这个子进程是从哪开始执行,到哪会结束
水手carl 2009-02-20
  • 打赏
  • 举报
回复

if ((cld_pid = fork()) == 0) {
if(fork()==0)
{
puts("孙子");
}
else
{
puts("儿子");
}
}
else
puts("老子");



仅会输出三句,不会一直循环
时哲 2009-02-20
  • 打赏
  • 举报
回复
看来是我傻啊,还没有看懂。等我看懂了再来向大家汇报思想。
转转耳朵 2009-02-20
  • 打赏
  • 举报
回复
//同一个父进程
#include <stdio.h>

int main()
{
int pid;
int i;

for(i=0;i<10;i++)
{
if ((pid = fork()) == 0) {
printf("子进程#%d\n",i);
exit(0);
}
else
puts("父进程");
}
return 0;
}

//子进程连续fork
#include <stdio.h>

int main()
{
int pid;
int i;

for(i=0;i<10;i++)
{
if ((pid = fork()) == 0)
{
printf("子进程#%d\n",i);
}
else
{
puts("父进程");
return 0;
}
}
return 0;
}


父子进程是以fork的返回开始区分,也就是同一次fork,只会执行一次,根据fork的返回值区分是父进程还是子进程,至于子进程是否能继续fork,当然是可以的,linux下的进程之间的关系,本来就是一棵树。

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧