在fork()进程期间没有父进程的操作时会发生什么?

时间:2017-10-31 04:46:52

标签: c process operating-system child-process

我有以下示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>

int main (){
    printf("hello world (pid:%d)\n", (int)getpid());
    int rc = fork();

    if(rc < 0){ //fork failed; exit
        fprintf(stderr, "fork failed\n");
        exit(1);

    } else if (rc == 0) { //child new process
        printf("hello, i am child (pid:%d)\n", (int)getpid());
        char *myargs[3];
        myargs[0] = strdup("wc"); //program: "wc" (word count)
        myargs[1] = strdup("p3.c"); //argument: file to count
        myargs[2] = NULL; //marks end of array
        execvp(myargs[0],myargs); //runs word count
        printf("this shouldn't print out");

    } else {//parent process
        // int wc = wait(NULL);
        // printf("hello, i am parent of %d (wc: %d) (pid: %d)\n", rc, wc, (int) getpid());
    }

    return 0;
}

所以我已经注释掉了else语句(父进程的参数或操作。我想知道会发生什么,或者如果父进程不必等待子进程,输出是否会保持不变?如果是这样,为什么?

我在想,既然子进程是父进程自己独立的进程,输出会保持不变,但这是唯一的原因吗?

一些指针会很好,谢谢!

1 个答案:

答案 0 :(得分:2)

这可以在两种情况下理解。

  1. 父母的执行时间&lt;孩子的执行时间
  2. 父母的执行时间&gt;孩子的执行时间
  3. 在案例1中,父进程在子进程之前退出,因此,init进程(pid 1)成为子进程的父进程;子进程继续执行。

    通常,在父进程完成之前,不能释放子进程(子进程的资源)。在案例2中,子进程仅在父进程完成后才被释放;直到那个时候,子进程变成了僵尸(在ps -al命令中不存在)。

    在此特定上下文中,当父进程无需执行任何操作时,子进程执行时间&gt;父母的执行时间,这只是父母的执行时间&lt;孩子的执行时间。这是案例1.因此,父进程退出,init进程成为子进程的父进程。