進程控制(fork和exit)

fork vs vfork

1.   成功調用一次,返回兩個值,子進程返回0,父進程返回子進程的pid;出錯返回-1

2.   頭文件:

         #include <unistd.h>

         #include <sys/types.h>

3.   fork函數會拷貝父進程的數據空間、堆棧等資源,這樣就會有兩份數據,與父進程不相干擾。

4.   vfork函數不會拷貝父進程的資源,與父進程公用一份資源,修改數據會影響到父進程的數據一致性。

5.   使用exec切換到新的程序或者使用exit退出。

6.   當調用vfork函數去創建子進程的時候,需要使用_exit()退出,因爲_exit()退出時,不會清除緩存區和關閉所有文件,若使用exit()退出則會嚴重影響父進程

 

Example

#include <stdio.h>

#include <unistd.h>

#include <sys/types.h>

 

void main(){

         pid_t pid;

         if(fork() == 0){            //子進程中

                   printf("In child process, pid is %d\n", getpid());

                   exit(0);

         }

         else{                            //父進程中

                   printf("In parent process, pid is %d\n", getpid());

         }

 

}

 

http://baike.baidu.com/view/1952900.htm

http://baike.baidu.com/view/1745340.htm

 

 

exit()  vs  _exit()

1.      exit(0) 表示正常退出,exit(xx) xx0則爲異常退出

2.      exit() 函數會直接退出程序,即便是在被調用的函數的外部函數執行;

3.      _exit() 直接使進程停止運行,清除其所使用的內存空間,並銷燬其在內核中的各種數據結構,exit()在調用exit系統調用之前要檢查文件的打開情況,把文件緩衝區的內容寫回文件。

 

#include <stdio.h>

#include <stdlib.h>

 

void main(){

         int i;

         for(i = 0; i < 3; i++){

                   printf("%i\n", i);

 

         }

         void func();

         func();

//      exit(0);

         printf("?????\n");             //不會被輸出

}

 

void func(){

         printf("In func\n");

         exit(0);

}

 

http://baike.baidu.com/view/1542946.htm

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章