C 退出和返回之间的差异
考虑下面的代码C 退出和返回之间的差异,c,fork,exit,C,Fork,Exit,考虑下面的代码 int glob = 6; /* external variable in initialized data */ int main(void) { int var; /* automatic variable on the stack */ pid_t pid; var = 88; printf("before vfork\n");
int glob = 6; /* external variable in initialized data */
int
main(void)
{
int var; /* automatic variable on the stack */
pid_t pid;
var = 88;
printf("before vfork\n"); /* we don't flush stdio */
if ( (pid = vfork()) < 0)
err_sys("vfork error");
else if (pid == 0) { /* child */
glob++; /* modify parent's variables */
var++;
_exit(0); /* child terminates */
}
/* parent */
printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
exit(0);
}
int glob=6;/*初始化数据中的外部变量*/
int
主(空)
{
int var;/*堆栈上的自动变量*/
pid_t pid;
var=88;
printf(“在vfork\n之前”);/*我们不刷新stdio*/
如果((pid=vfork())<0)
系统错误(“工作错误”);
如果(pid==0){/*child*/
glob++;/*修改父变量*/
var++;
_退出(0);/*子级终止*/
}
/*母公司*/
printf(“pid=%d,glob=%d,var=%d\n”,getpid(),glob,var);
出口(0);
}
这是一个解释如何使用vfork系统调用的示例。
如果不使用_exit,而是使用return,则会得到不同的输出值。返回不等于调用_exit吗?为什么不呢?“除了如果由
vWork()
创建的进程修改了除用于存储vWork()
返回值的pid\t
类型的变量以外的任何数据,则行为是未定义的。”“子进程不能从当前函数返回或调用exit(3)
,但可以调用\u exit(2)
“不,return
不等同于\u exit()
,有点等同于exit()
。已经讨论过了!好啊这也是错误的,因为这两个进程共享堆栈?