当前位置: 技术问答>linux和unix
求解exit(0)和return 0 的区别
来源: 互联网 发布时间:2017-04-07
本文导语: 这是代码 很简单,但输出却不同,使用return 0会产生段错误。而exit(0)执行正常,我就是想知道为什么?? 1 #include 2 #include 3 #include 4 #include 5 #include 6 in...
这是代码 很简单,但输出却不同,使用return 0会产生段错误。而exit(0)执行正常,我就是想知道为什么??
1 #include
2 #include
3 #include
4 #include
5 #include
6 int glob=6;
7 //int var;
8 //int temp=1;
9 int main()
10 {
11 int var;
12 pid_t pid ;
13 var =88;
14 int temp=1;
15
16 printf("in beginning: tglob=%dtvar=%dttemp=%dn",glob,var,tem p);
17
18 pid=vfork();
19 if(pid0)
37 {
38 printf("i'm parent:glob=%dtvar=%dttemp=%dn",glob,var, temp);
39 return 0;
40 }
41
42 //return 0;
43 }
注意;红色部分
exit(0)是强制是程序终止,而return 0是返回给函数而已,但如果在line42 返回的话,也相当于执行完进程。所以我很困惑!
希望给位大神给我一个满意的答案! 小弟鸟中之鸟??
1 #include
2 #include
3 #include
4 #include
5 #include
6 int glob=6;
7 //int var;
8 //int temp=1;
9 int main()
10 {
11 int var;
12 pid_t pid ;
13 var =88;
14 int temp=1;
15
16 printf("in beginning: tglob=%dtvar=%dttemp=%dn",glob,var,tem p);
17
18 pid=vfork();
19 if(pid0)
37 {
38 printf("i'm parent:glob=%dtvar=%dttemp=%dn",glob,var, temp);
39 return 0;
40 }
41
42 //return 0;
43 }
注意;红色部分
exit(0)是强制是程序终止,而return 0是返回给函数而已,但如果在line42 返回的话,也相当于执行完进程。所以我很困惑!
希望给位大神给我一个满意的答案! 小弟鸟中之鸟??
|
这个跟vfork()有关。
看联机帮助
The child shares all memory with its parent, including the stack, until execve() is issued by the child. The child must not return from the current function or call exit(), but may call _exit().
看联机帮助
The child shares all memory with its parent, including the stack, until execve() is issued by the child. The child must not return from the current function or call exit(), but may call _exit().
|
用return 0返回的终极原因是:父进程的栈被破坏了。
1. vfork比较特殊,它创建的子进程和父进程共享一切,因此栈也是共享的。
2. 当子进程调用了return 0返回后,会弹出栈里面的返回地址(就是当初压入main函数的那条指令的下一条指令的地址),然后在调用_exit(crt1.o里面的)退出。
3. 在第2步中由于共享栈被破坏了(返回地址不见了),因此父进程再次调用return 0的时候就会将错误的返回地址弹出,由此发生了段错误!
1. vfork比较特殊,它创建的子进程和父进程共享一切,因此栈也是共享的。
2. 当子进程调用了return 0返回后,会弹出栈里面的返回地址(就是当初压入main函数的那条指令的下一条指令的地址),然后在调用_exit(crt1.o里面的)退出。
3. 在第2步中由于共享栈被破坏了(返回地址不见了),因此父进程再次调用return 0的时候就会将错误的返回地址弹出,由此发生了段错误!