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) xx非0則爲異常退出
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