C 单亲进程的多个子进程
如何在这里使用waitpid()命令等待其子项的终止,然后显示PIDC 单亲进程的多个子进程,c,linux,terminal,C,Linux,Terminal,如何在这里使用waitpid()命令等待其子项的终止,然后显示PID for(int i=0; i < 5 ;i++) { if(pid > 0) { pid = fork(); c++; if(pid==0) { printf("child: %d \n",c); printf("child process with pid self %d \n", g
for(int i=0; i < 5 ;i++)
{
if(pid > 0)
{
pid = fork();
c++;
if(pid==0)
{
printf("child: %d \n",c);
printf("child process with pid self %d \n", getpid());
}
}
}
for(int i=0;i<5;i++)
{
如果(pid>0)
{
pid=fork();
C++;
如果(pid==0)
{
printf(“子项:%d\n”,c);
printf(“pid自身为%d的子进程”,getpid());
}
}
}
您应该像这样重构循环:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>
...
pid_t pid;
for (int i = 0; i < 5; i++) {
pid = fork();
if (pid == 0) {
printf("child process with pid %d\n", getpid());
...
exit(0);
} else if (pid > 0) {
/* the child has been forked and we are in the parent */
} else {
/* could not fork child */
}
}
int status;
while ((pid = waitpid(-1, &status, 0))) {
if (pid == -1 && errno == ECHILD) {
break;
} else if (pid == -1) {
perror("waitpid");
} else if (WIFEXITED(status)) {
printf("%d exited, status=%d\n", pid, WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
printf("%d killed by signal %d\n", pid, WTERMSIG(status));
} else if (WIFSTOPPED(status)) {
printf("%d stopped by signal %d\n", pid, WSTOPSIG(status));
} else if (WIFCONTINUED(status)) {
printf("%d continued\n", pid);
}
}
#包括
#包括
#包括
#包括
...
pid_t pid;
对于(int i=0;i<5;i++){
pid=fork();
如果(pid==0){
printf(“pid为%d的子进程”,getpid());
...
出口(0);
}否则,如果(pid>0){
/*孩子被叉了,我们在父母家*/
}否则{
/*不能叉孩子*/
}
}
智力状态;
while((pid=waitpid(-1,&status,0))){
如果(pid=-1&&errno==ECHILD){
打破
}否则如果(pid==-1){
佩罗(“waitpid”);
}否则,如果(妻子退出(状态)){
printf(“%d已退出,状态=%d\n”,pid,WEXITSTATUS(状态));
}否则如果(WIFSIGNALED(状态)){
printf(“%d被信号%d\n终止”,pid,WTERMSIG(状态));
}否则如果(WIFSTOPED(状态)){
printf(“%d被信号%d\n停止”,pid,WSTOPSIG(状态));
}否则如果(WIFCONTINUED(状态)){
printf(“%d续\n”,pid);
}
}
注意在子块的末尾包含了对exit
的调用。这是为了防止子循环继续执行而需要的
第二个循环应一直运行,直到所有子循环终止。和。正确。只需补充一件事,放if(pid=-1)来检查fork是否成功生成总是很好的。@koksalb:
else
分支用于处理我的示例中的失败。我复制粘贴了您的代码,它在“if(errno==ECHILD){”未声明(此函数中首次使用)if(errno==ECHILD)处给我一个错误{^Q.c:41:10:注意:对于出现在Q.c:41:19:error中的每个函数,每个未声明的标识符只报告一次:'ECHILD'未声明(此函数中首次使用)if(errno==ECHILD){@SunAns:#包括
好的,还有一件事。我应该在这个“if(errno==ECHILD)”中打印终止孩子的PID,因为你说这是孩子一个接一个终止的循环。提前谢谢你!