我有以下示例代码:
#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语句(父进程的参数或操作。我想知道会发生什么,或者如果父进程不必等待子进程,输出是否会保持不变?如果是这样,为什么?
我在想,既然子进程是父进程自己独立的进程,输出会保持不变,但这是唯一的原因吗?
一些指针会很好,谢谢!
答案 0 :(得分:2)
这可以在两种情况下理解。
在案例1中,父进程在子进程之前退出,因此,init进程(pid 1)成为子进程的父进程;子进程继续执行。
通常,在父进程完成之前,不能释放子进程(子进程的资源)。在案例2中,子进程仅在父进程完成后才被释放;直到那个时候,子进程变成了僵尸(在ps -al
命令中不存在)。
在此特定上下文中,当父进程无需执行任何操作时,子进程执行时间&gt;父母的执行时间,这只是父母的执行时间&lt;孩子的执行时间。这是案例1.因此,父进程退出,init进程成为子进程的父进程。