我获得了一个项目的入门代码,但我很难理解子进程的执行方式。
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 :(得分: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
意味着“这是孩子的过程吗?”。如果是这样,它将执行通过命令行参数传递的程序。