我是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);
}
Run Code Online (Sandbox Code Playgroud)
但我的问题是
当循环中的父进程执行wait时,为什么下面的代码是错误的
#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);
}
}
Run Code Online (Sandbox Code Playgroud)在第一个代码中为什么我们wait(NULL)在for循环中写入?没有for循环我们不能写它
如果子进程中没有"返回0",则应将for循环更改为
for (i = 0; i <7; i++)
wait(NULL);
Run Code Online (Sandbox Code Playgroud)我不知道怎么写这个CPU函数
此代码不会并行执行子进程,而是按顺序执行每个进程.直到子进程执行除打印一条消息和退出(您可以添加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;
}
}
Run Code Online (Sandbox Code Playgroud)每个父进程应该等待自己的子进程(或设置SIGCHLD处置SIG_IGN).不要计算waits 的数量,而是使用上面的代码
这意味着:"通过名称调用函数CPU",即
void CPU(void) {
}
Run Code Online (Sandbox Code Playgroud)
在孩子的过程中.
顺便说一下,你的代码缺少几个函数的必要头文件 -
#include <sys/types.h>
#include <sys/wait.h>
Run Code Online (Sandbox Code Playgroud)
对于wait,
#include <unistd.h>
Run Code Online (Sandbox Code Playgroud)
对fork,另外#include <errno.h>我的errno加法.
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |