请教多子进程问题

lwmonster 2011-05-16 02:35:20
创建2个子进程的时候这样:

int main()

{

pid_t child1;

pid_t child2;

child1 = fork();

child2 = fork();

if(child1 == 0)

{

printf("Child1:a\n");

return 0;

}

if(child2 == 0)

{

printf("Child2:b\n");

return 0;

}

else

{

waitpid(child1,NULL,0);

waitpid(child2,NULL,0);

printf("Parent:c\n");

}

return 0;

}



这样写的情况下 其实是创建了3个子进程, 子进程1里又创建了一个孙子进程。现在我想问的是,如果用循环来创建的话,就不会出现创建孙子进程的情况吗?为什么?
比如:

for (int i = 0; i<2; i++)
{
pid = fork();
if(pid <0){ }
else if (pid == 0){ }
else{ }

}



...全文
128 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lwmonster 2011-05-18
  • 打赏
  • 举报
回复
把我的代码贴出来,和大家分享一下,我的目的就是 两个子进程轮流执行,各执行5秒,每次执行1秒,开始担心创建2个子进程的时候会出问题....

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/times.h>
#include <limits.h>
#include <sys/resource.h>

int main()
{
pid_t pid,pid1;
int i;
int status;

//printf("before fork, pid = %d\n",getpid());
pid = fork();

if( pid ==0 )
{
//printf("in child, pid = %d \n", getpid());
//execl("/bin/ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm",NULL);
execl("./st","st","5",NULL);
exit(0);
}
else
{
//printf("in father ,pid= %d\n", getpid());
sleep(1);
kill(pid,SIGTSTP);
waitpid(pid,&status,WUNTRACED);
pid1 = fork();
if (pid1 == 0)
{
execl("./st","st","5",NULL);
exit(0);
}
else
{
sleep(1);
for( i = 0; i < 5; i ++)
{
kill(pid1,SIGTSTP);
waitpid(pid1,&status,WUNTRACED);
kill(pid,SIGCONT);
sleep(1);
kill(pid,SIGTSTP);
waitpid(pid,&status,WUNTRACED);
kill(pid1,SIGCONT);
sleep(1);

}
}
waitpid(pid, &status,0);
}
return 0;

}

lwmonster 2011-05-18
  • 打赏
  • 举报
回复
可能是我没表达清楚,上面的兄弟们辛苦了,我搞了本大砖头看了下,已经明白了,谢谢大家回复了,虽然都和我的意思不一样。
yong_f 2011-05-18
  • 打赏
  • 举报
回复
在创建进程的时候如果fork()返回0则是子进程,再子进程调用exec函数。就不会再执行父进程的代码了,也就不会再创建进程了。
lwmonster 2011-05-16
  • 打赏
  • 举报
回复
to:YTerrenceLau justkk
谢谢回复! 可是我还有问题,那就是如果这样:else if (pid == 0){ ..; exit(0);} 这时子进程应该就退出了吧,那我应该就不能再用此子进程了吧,可是我的子进程不一定把任务执行完了, 有可能因为缺少资源被父进程用信号给阻塞了,那要怎么办呢?



[Quote=引用 2 楼 justkk 的回复:]

else if (pid == 0){ ..; exit(0);}

也就是在子进程中,最后加一个exit(0);
[/Quote]
justkk 2011-05-16
  • 打赏
  • 举报
回复
else if (pid == 0){ ..; exit(0);}

也就是在子进程中,最后加一个exit(0);
YTerrenceLau 2011-05-16
  • 打赏
  • 举报
回复
pid == 0 就break出去。
Arnold9009 2011-05-16
  • 打赏
  • 举报
回复
关键是要搞清楚哪些代码是在哪个进程里执行的。。。。。。。。。。。。搞清楚之后就很easy了
yanghuajia 2011-05-16
  • 打赏
  • 举报
回复
int main()

{

pid_t child1;

pid_t child2;

child1 = fork();



if(child1 == 0)

{

printf("Child1:a\n");

return 0;

}

child2 = fork();
if(child2 == 0)

{

printf("Child2:b\n");

return 0;

}

else

{

waitpid(child1,NULL,0);

waitpid(child2,NULL,0);

printf("Parent:c\n");

}

return 0;

}

  • 打赏
  • 举报
回复
每个fork正常情况下都会返回2次,一次主进程,返回子进程pid值,一次子进程,返回0.

你要是想控制每个子进程的返回都不再执行下面的fork,那就每个 fork后面加个if( XX==0)即可
lwmonster 2011-05-16
  • 打赏
  • 举报
回复
具体点就是 操作系统在进行进程调度的时候,操作系统会创建多个子进程,让这些进程按照时间片执行,时间片到了就把处理机剥夺(此时子进程没有exit,而是处于等待状态),等待下次调用,现在我的程序就相当于操作系统了,怎么创建出2个或者多个 互不干扰的子进程,由父进程调度 多次,父进程觉得可以了才释放掉子进程?

to: justkk 有没有qq呀?

[Quote=引用 4 楼 justkk 的回复:]

没看懂问题..
子进程完成操作之后,调用exit(0)就完了啊
[/Quote]
justkk 2011-05-16
  • 打赏
  • 举报
回复
不是让你加在最后吗
你子进程完成所有的任务之后再exit(0)啊
lwmonster 2011-05-16
  • 打赏
  • 举报
回复
我的意思是: 父进程 会创建 2个子进程,但是子进程不是执行一次就完成任务的,可能因为缺少资源执行一次之后要阻塞起来,等待父进程唤醒,那调用exit(0)的话,子进程就退出了,就没办法继续工作了呀

[Quote=引用 4 楼 justkk 的回复:]

没看懂问题..
子进程完成操作之后,调用exit(0)就完了啊
[/Quote]
justkk 2011-05-16
  • 打赏
  • 举报
回复
没看懂问题..
子进程完成操作之后,调用exit(0)就完了啊

23,121

社区成员

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

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