所以我正在尝试申请fork()
2个孩子。
for(i=1; i<=50000; i++)
循环for(i=50000; i<=100000; i++)
循环for(asciic=65; asciic<=90; asciic++)
- &gt;用于打印A到Z字母的循环我需要所有三个人一起工作,而不是一个接一个地工作。
我查看了互联网,我找不到合适的方式,我找到的只是创建子进程的循环,但它们几乎完全相同,大多数都是一个接一个地创建的。
感谢任何帮助。
要更加了解,这是我在发布之前所做的:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void) {
pid_t child_pid,child_pid1;
int i=0;
int stare;
int asciic;
child_pid=fork();
child_pid1=fork();
if (child_pid==0) {
//printf("Father PID: %d -> Child 1: %d\n",getppid(),getpid());
for(i=1; i<=50000; i++){
printf("%d-%d\n",getpid(),i);
}
exit(0);
} else if (child_pid1==0) {
//printf("Father PID: %d -> Child 2: %d\n",getppid(),getpid());
for(i=50000; i<=100000; i++) {
printf("%d-%d\n",getpid(),i);
}
exit(0);
} else {
//printf("PID-ul procesului parinte: %d\n", getpid());
pid_t rez=waitpid(child_pid,&stare,WNOHANG);
pid_t rez1=waitpid(child_pid1,&stare,WNOHANG);
while(rez==0 || rez1==0){
for(asciic=65; asciic<=90; asciic++){
printf("%d- %c\n",getpid(),asciic);
}
rez=waitpid(child_pid,&stare,WNOHANG);
rez1=waitpid(child_pid1,&stare,WNOHANG);
}
}
return 0;
}
如果我注释掉循环,我可以看到孩子有不同的PID,1个孩子有正确的父PID,而其他孩子有其他父PID。
答案 0 :(得分:2)
你的两条叉子:
child_pid=fork();
child_pid1=fork();
不要创建2个孩子,而是创建3个孩子:父母在第一个fork()
中创建第一个孩子。从那一刻起,有两个过程:父母和孩子。并且每个人都执行第二个fork()
。你将有1个父母,2个孩子和1个孙子。
为了只有1个父母和2个孩子,您必须:
pid1 = fork();
if (pid1 < 0) {
/* Error in fork() */
} else if (pid1 == 0) {
/* first child */
exit(0);
}
pid2 = fork();
if (pid2 < 0) {
/* Error in fork() */
} else if (pid2 == 0) {
/* second child */
exit(0);
}
/* parent */
此外,即使你的代码是正确的,你也不能“看到”进程是同时运行还是不只是查看它们的输出。事实上,即使有多个进程“同时”执行,您可能会看到其中一个进程在另一个进程启动之前完成。这是因为内核通常会进行时间多路复用,为每个孩子提供一些CPU时间。如果流程需要更长时间才能完成,您可以看到并发性,例如添加一些sleep()
。
答案 1 :(得分:1)
fork()
将子项的pid_t
返回给调用者(父项),如果失败则返回-1。在孩子中,返回0。你可以简单地测试一下
if (fork())
{
//do one thing
}
else
{
//do something else
}
答案 2 :(得分:1)
问题在于:
child_pid=fork();
child_pid1=fork(); // This line will be executed by both parent and first child!!!
你需要将第二个fork移动到第一个fork的父部分中,然后为第二个子节点设置一个单独的if。