Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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 wait()函数的行为_C_Wait - Fatal编程技术网

C wait()函数的行为

C wait()函数的行为,c,wait,C,Wait,我有以下代码: #include <stdio.h> main(int argc, char *argv[]) { int n,st; n = atoi(argv[1]); while(n*fork()) { printf("%d %d\n",getpid(), getppid()); n--; printf("%d\n", wait(&st)); printf("------\n");

我有以下代码:

#include <stdio.h>
main(int argc, char *argv[])
{
    int n,st;
    n = atoi(argv[1]);
    while(n*fork()) {
        printf("%d %d\n",getpid(), getppid());
        n--;
        printf("%d\n", wait(&st));
        printf("------\n");
    }
}
以下是我的想法: 父项正在创建子项:

10218 9948
但是之后,我不明白为什么
printf(“%d\n”,wait(&st))返回此id:10219

wait()


有人能帮忙吗

fork
对子进程返回零,因此只有原始进程进入while循环;孩子们没有打印任何东西就离开了

每次父进程打印其进程id和父进程id,然后打印子进程id作为wait的返回值时


在您的示例中,原始进程的pid=10218,它用进程ID 10219、10220、10221等派生子进程。

fork
为子进程返回零,因此只有原始进程进入while循环;孩子们没有打印任何东西就离开了

每次父进程打印其进程id和父进程id,然后打印子进程id作为wait的返回值时

在您的示例中,原始进程的pid=10218,它用进程ID 10219、10220、10221等派生子进程。

这完全可以

如果您对fork()创建的进程的PID感兴趣,应该打印返回值

getpid将始终返回主进程的PID,并返回其父进程(shell)的getppid。因为它们不会改变,所以在循环中打印它们是没有意义的。

这很好

如果您对fork()创建的进程的PID感兴趣,应该打印返回值


getpid将始终返回主进程的PID,并返回其父进程(shell)的getppid。因为它们没有改变,所以在循环中打印它们是没有意义的。

等待没有阻塞,因为没有阻塞的理由。子项已完成执行。这是因为Linux将计划先运行“子”进程

以下是以图表形式显示的情况:

bash(9948)
|
|       main(10218)       child1(10219)       child2(10220)      child3(10221)
>-------------->
               |
             fork--------------->
                                |
                            while(0);
                            terminate;
                                |
             print 10218 9948---<
             wait (no block)
             print 10219
              |
             fork----------------------------------->
                                                    |
                                                while(0);
                                                terminate;
                                                    |
             print 10218 9948-----------------------<
             wait (no block)
             print 10220
              |
             fork----------------------------------------------------->
                                                                      |
                                                                  while(0);
                                                                  terminate;
                                                                      |
             print 10218 9948-----------------------------------------<
             wait (no block)
             print 10221
             terminate
               |
---------------<
bash(9948)
|
|主要(10218)儿童1(10219)儿童2(10220)儿童3(10221)
>-------------->
|
叉子----------------->
|
而(0);
终止
|
打印102189948---<
等待(无阻塞)
打印10219
|
叉子------------------------------------------>
|
而(0);
终止
|
打印102189948-----------------------<
等待(无阻塞)
打印10220
|
叉子------------------------------------------>
|
而(0);
终止
|
打印102189948-----------------------------------------<
等待(无阻塞)
打印10221
终止
|
---------------<

等待未被阻止,因为没有阻止的理由。子项已完成执行。这是因为Linux将计划先运行“子”进程

以下是以图表形式显示的情况:

bash(9948)
|
|       main(10218)       child1(10219)       child2(10220)      child3(10221)
>-------------->
               |
             fork--------------->
                                |
                            while(0);
                            terminate;
                                |
             print 10218 9948---<
             wait (no block)
             print 10219
              |
             fork----------------------------------->
                                                    |
                                                while(0);
                                                terminate;
                                                    |
             print 10218 9948-----------------------<
             wait (no block)
             print 10220
              |
             fork----------------------------------------------------->
                                                                      |
                                                                  while(0);
                                                                  terminate;
                                                                      |
             print 10218 9948-----------------------------------------<
             wait (no block)
             print 10221
             terminate
               |
---------------<
bash(9948)
|
|主要(10218)儿童1(10219)儿童2(10220)儿童3(10221)
>-------------->
|
叉子----------------->
|
而(0);
终止
|
打印102189948---<
等待(无阻塞)
打印10219
|
叉子------------------------------------------>
|
而(0);
终止
|
打印102189948-----------------------<
等待(无阻塞)
打印10220
|
叉子------------------------------------------>
|
而(0);
终止
|
打印102189948-----------------------------------------<
等待(无阻塞)
打印10221
终止
|
---------------<

原始进程的进程id是10218,子进程的进程id是10219、10220、10221等。有什么问题吗?9948是您的shell的PID。原始进程的进程id是10218,子进程的进程id是10219、10220、10221等。有什么问题吗?9948是您的shell的PID。@Elia没有问题。如果您认为正确答案有帮助,请随意标记:-)@Elias没问题。如果您觉得有帮助,请随时标记为正确答案:-)