我是C的新手,所以我只知道简单的函数。(例如:wait(NULL))。
这是我的主要问题:
修改程序,以便只有父进程创建3个子进程,每个进程创建一个子进程 新创建的进程调用函数CPU()。另外,让父进程等待 每个孩子的终止。
我知道这是正确答案
#include<stdio.h>
int main(void)
{
int i ;
for( i = 0; i < 3; i++)
{
int ret = fork();
if(ret == 0){
printf("My process ID is %d\n", getpid());
return 0;
}
}
for (i = 0; i < 3; i++) //Line B
wait(NULL);
}
但我的问题是
为什么下面的代码在循环中的父级执行等待时出错
#include <stdio.h>
int main(void)
{
int i ;
for( i = 0; i < 3; i++)
{
int ret = fork();
if(ret == 0) {
printf("My process ID is %d\n", getpid());
return 0;
}
else
wait(NULL);
}
}
在第一个代码中为什么我们在for循环中写wait(NULL)
?
我们不能在没有for循环的情况下编写它
如果没有&#34;则返回0&#34;在子进程中,是否应将for循环更改为
for (i = 0; i <7; i++)
wait(NULL);
我不知道如何撰写CPU
函数
答案 0 :(得分:6)
此代码不会并行执行子进程 ,而是按顺序执行每个进程。差异不显示直到子进程执行除打印一条消息和退出之外的事情(您可以添加sleep(1)
)。
wait
函数将等待一个子进程的终止(以先到者为准)。如果您有3个子进程,则必须至少成功调用wait
3次以确保其中每个进程已终止。也许更容易致电wait
,直到它将errno
设置为ECHILD
,这意味着没有孩子离开:
while (1) {
errno = 0;
if (wait(NULL) == -1) {
if (errno != ECHILD) {
perror("Unexpected error from wait");
}
break;
}
}
每个父流程都应该等待自己的孩子(or set the SIGCHLD
disposition to SIG_IGN
)。不要计算wait
的数量,而是使用上面的代码
这意味着:&#34;通过名称CPU
&#34;来调用一个函数,即
void CPU(void) {
}
在子进程中。
顺便说一下,你的代码缺少几个函数的必要标题 -
#include <sys/types.h>
#include <sys/wait.h>
代表wait
,
#include <unistd.h>
用于fork
,另外#include <errno.h>
用于添加errno
。