exit 和_exit的差別是:exit是要做一些操作才進入核心終結的,比如清除緩存之類的。但是_exit()則是立即進入記憶體終結,不會進行exit該有的操作。這樣就出現這樣的問題。
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
int glob = 100;
int main()
{
pid_t pid;
int var;
var = 10;
if((pid = vfork()) < 0)
printf("fork() error");
else if(pid == 0)
{
var ++;
glob ++;
_exit(0);
}
printf("pid = %d,var = %d,glob = %d\n",pid,var,glob);
}
上面的代碼輸出是有的,var和glob都是自增了1。但是如果将_exit(0)改成exit(0),情況會是什麼呢?因為vfork是在父程序空間運作的,那會不會不會輸出呢。
我的linux是centOS 5.5。當然沒有出現那個問題。輸出與_exit(0)是一樣的。我就多運作了幾次,還是一樣的。估計是系統做了什麼修改吧。
那怎麼可以實作不輸出呢。答案當然是關閉輸出流。
close(STDOUT_FILENO);他是在
<unistd.h>
包裡面的。
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
int glob = 100;
int main()
{
pid_t pid;
int var;
var = 10;
if((pid = vfork()) < 0)
printf("fork() error");
else if(pid == 0)
{
var ++;
glob ++;
close(STDOUT_FILENO);
exit(0);
}
printf("pid = %d,var = %d,glob = %d\n",pid,var,glob);
}
這樣的結果是,還是會有輸出。輸出結果與最開始是一樣的。我就又改了改。
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
int glob = 100;
int main()
{
pid_t pid;
int var;
var = 10;
if((pid = vfork()) < 0)
printf("fork() error");
else if(pid == 0)
{
var ++;
glob ++;
exit(0);
}
close(STDOUT_FILENO);
printf("pid = %d,var = %d,glob = %d\n",pid,var,glob);
}
這樣,就沒有輸出了。
但是vfork是在父程序裡面運作的,我很納悶,為什麼在子程序裡面關閉輸出流不行?VFORK不是占用的父程序的空間運作嗎?這個我是借鑒在UNIX環境進階程式設計裡面的代碼,然後瞎想了一番得來的。