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

时间:2011-04-22 02:14:16

标签: c process fork

我获得了一个项目的入门代码,但我很难理解子进程的执行方式。

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.

4 个答案:

答案 0 :(得分:3)

来自fork的精细手册:

  

成功完成后, fork()将向子进程返回0,并将子进程的进程ID返回给父进程。

if的第一个分支是错误条件,如果出现错误,将在父进程中执行。第二个分支(pid == 0)在子进程中执行,子进行一些信号管理并执行exec。没有错误时,第三个分支在父级中。

在父级中,pid将为非零,但在新子进程中,pid将为零。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

只创建了一个新流程;孩子。

子进程中的

fork()返回0,这是您正在检查的内容。

父进程中的

fork()(您的原始进程)返回子进程'pid。

通过检查fork() 0的回复,您知道您是父母还是孩子;你是孩子,如果是0

答案 3 :(得分:1)

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