Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 单亲进程的多个子进程_C_Linux_Terminal - Fatal编程技术网

C 单亲进程的多个子进程

C 单亲进程的多个子进程,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

如何在这里使用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", 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,因为你说这是孩子一个接一个终止的循环。提前谢谢你!