了解子代程序在此代码中的执行方式

问题描述:

我被授予该项目的启动代码,但难以理解子程序如何执行。了解子代程序在此代码中的执行方式

int pid ; 
int child_info = -1; 

if (argv[0] == NULL)  /* nothing succeeds */ 
    return 0; 

if((pid= fork()==-1) 
    perror("fork"); 

else if (pid == 0){ 

    signal(SIGINT, SIG_DFL); 
    signal(SIGQUIT, SIG_DFL); 
    execvp(argv[0], argv); 
    perror("cannot execute command"); 
    exit(1); 
} 
else { //check if wait error or print out exit status 
    if (wait(&child_info) == -1) 
    perror("wait"); 
    else { 
    printf("Exit status: %d, %d\n", child_info>>8, child_info&0377); 
} 
    } 
    return child_info; 
} 

看代码,当前进程叉,在这种情况下,孩子都继承父进程的相关性,因为不涉及定时器,信号或任何东西。但是,新进程的pid值在18000范围内,所以如何执行execvp(argv[0], argv),因为在这种情况下,pid!= 0.

+0

我不明白你的问题...... – 2011-04-22 02:20:14

从细手册fork

成功完成后,叉()应返回0给子过程,并应子进程的进程ID返回给父进程。

if的第一个分支是一个错误条件,如果发生错误,它将在父进程中执行。第二个分支(pid == 0)在子​​进程中执行,孩子做了一些信号管理并执行exec。没有错误时,第三个分支位于父项中。

在父项中,pid将为非零,但在新的子项过程中,pid将为零。

+0

这就是我所缺少的。 – Jason 2011-04-22 02:26:28

它在子进程中执行,其中pid将为0. http://linux.die.net/man/2/fork

只有一个新的过程被创建;孩子。

fork()在子进程中返回0,这就是你要检查的内容。

fork()在父进程(您的原始进程)中返回子进程的PID。

通过检查fork()0的回报,你知道你是父母还是孩子;如果是0,那么你就是这个孩子。

Fork返回子进程的父进程和0子进程。所以当询问pid == 0意味着“这是孩子的过程?”。如果是这样,它会执行通过命令行参数传递的程序。