问题描述
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
int main() {
int pid;
int pids[3];
int status;
int numprocesses = 0;
int total_processes = 3;
while (numprocesses < total_processes) {
pid = fork();
// Child process
if (pid == 0) {
printf("In child process: process id is %d\n",getpid());
sleep(5);
return 4;
} else {
pids[numprocesses] = pid;
numprocesses++;
printf("In parent process: created process number: %d\n",pid);
}
}
printf("Checking\n");
// Waiting for 3rd child process
waitpid(pids[total_processes - 1],&status,0);
if (WIFEXITED(status) != 0) {
printf("process %d exited normally\n",pids[total_processes - 1]);
printf("exit status from child is %d\n",WEXITSTATUS(status));
} else {
printf("process %d not exited normally\n",pids[total_processes - 1]);
}
return 0;
}
我的期望是应该从父进程和子进程打印“检查”字符串。但是 'Checking' 字符串只打印一次。
这是否意味着只有 if (pid == 0) {..} 中的代码会被子进程执行?
解决方法
这是否意味着只有 '\0'
中的代码会被子进程执行?
是的。该块的末尾有一个 $ ./bin/strinori
Digite o que vai ser convertido: My Dog Has Fleas!
String modificada: MY DOG HAS FLEAS!
语句。孩子在那个时候退出。
这是否意味着只有 if (pid == 0) {..} 中的代码才会是 由子进程执行?
是的,是的。成功时,父进程返回子进程的PID,子进程返回0。失败时,在父进程中返回 -1,不创建子进程,并设置 errno 以指示错误。
您的代码检查 0(父进程)而不是 -1(错误)。应该...
,我的期望是应该从父进程和子进程打印“检查”字符串。但是 'Checking' 字符串只打印一次。
您发布的代码包含此子特定代码:
// Child process
if (pid == 0) {
printf("In child process: process id is %d\n",getpid());
sleep(5);
return 4;
} else {
...
和最后的 return 4;
语句使子进程从 main()
返回并且不在 while
循环之后执行部分。
这确实使您免于某些事情......也就是说,您单亲父母的所有孩子都进行了 return 4;
并且您的父母应该执行尽可能多的 wait()
调用以等待所有孩子.如果有任何孩子退出循环,因为他们没有创建 fork()
,他们将从 wait
返回并返回一个错误 (errno == ECHILD
),表明没有创建任何孩子,并且等待。
所以,唯一退出循环的进程是在循环中创建的所有子进程的父进程。所以应该只有一个 Checking
,因为只有一个进程执行它。
如果不是 return 4;
你应该有 break;
循环,那么你应该有一个 Checking
每个孩子,错误地调用 wait
,还有一个父母,只有一个孩子被通知(哪个是不可预测的,很可能是第一个exit(2)
)