天天看點

vfork程式無限循環

我看資料說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

他寫了很多文章,大家也可以去看看的