我看資料說vfork會保證子程序先調子程序,并且子程序調用exit或者exec後父程序才可能被調用,那我既不調用exit又不調用exec,我用return會怎麼樣,或者我什麼也不調用又會出現什麼情況呢?
我的代碼是這樣的:
#include <stdio.h>
#include <stdlib.h>
int g_val=0;
int main()
{
int val = 0;
// pid_t id = fork();
pid_t id = vfork();
if(id < 0)
{
printf("error\n");
exit(0);
}
else if(id ==0)
{
printf("child val:%d g_val:%d\n",val,g_val);
sleep(1);
++val;
++g_val;
// exit(0); //子程序必須調用exec或exit後父程序才可能被排程
// return 0;
}
else
{
g_val++;
printf("father val:%d g_val:%d\n",val,g_val);
sleep(1);
}
return 0;
}
1. 其中子程序使用exit的時候的結果如下:
[[email protected] vfork]$ ./vfork
child val:0 g_val:0
father val:1 g_val:2
[[email protected] vfork]$
2. 子程序中使用return的時候:
[[email protected] vfork]$ ./vfork
child val:0 g_val:0
father val:7790715 g_val:2
child val:0 g_val:2
father val:7790715 g_val:4
child val:0 g_val:4
father val:7790715 g_val:6
child val:0 g_val:6
father val:7790715 g_val:8
child val:0 g_val:8
father val:7790715 g_val:10
child val:0 g_val:10
father val:7790715 g_val:12
child val:0 g_val:12
father val:7790715 g_val:14
^C
[[email protected] vfork]$
3.子程序中既不調用exit也不調用return的時候:
[[email protected] vfork]$ ./vfork
child val:0 g_val:0
father val:7790715 g_val:2
child val:0 g_val:2
father val:7790715 g_val:4
child val:0 g_val:4
father val:7790715 g_val:6
child val:0 g_val:6
father val:7790715 g_val:8
child val:0 g_val:8
father val:7790715 g_val:10
^C
[[email protected] vfork]$
調用exit和預想的結果一樣,父程序的空間被修改。但是調用return則有些不解。
剛剛開始的時候我也覺得不可思議,不是說了子程序沒有調用exit或者exec父程序不會被調用嗎?怎麼父程序還是被調用了,而且他們怎麼還成了死循環了呢?或者說我什麼既不調用return又不調用exit怎麼也成了死循環了。
結合網上的資料,我自己也想了一下,return 的時候程式的棧空間會釋放,清理資源。而且是子程序調用的return啊,子程序還先調用啊,過河拆橋?這真是“坑爹”啊,父程序運作的棧都被破壞了,還怎麼執行啊。至于什麼都不調用我想和這個差不多吧,子程序實在父程序空間上運作的,子程序運作結束後會自動清理資源,和return一樣。
現在想想這個确實不是什麼很難的問題,但是就當是寫給自己和那些還沒弄懂的人看吧,萬一哪天我忘記了,還可以回頭來再看看
我是看了這位大神的 http://coolshell.cn/articles/12103.html
他寫了很多文章,大家也可以去看看的