所以child process應該要使用 _exit(0) 離開
而非使用exit(0)或return
下面的main程式碼片段
在程式碼1
結果理論上應該是在child process呼叫exit(0);後
parent process就沒有機會執行
但是卻印出Parent
程式碼2
符合預期
程式碼3
理論上應該跟exit(0);一樣
parent process沒有機會執行
但是卻印出Parent
而且還出現程式記憶體區段錯誤 (core dumped)
怎麼會這樣?
--------------程式碼1-----------------
pid = vfork() ;
if (pid ==0 )
{
printf("child\n");
exit(0);
}
else
{
printf("Parent\n");
}
結果:
child
Parent
--------------程式碼2-----------------
pid = vfork() ;
if (pid ==0 )
{
printf("child\n");
_exit(0);
}
else
{
printf("Parent\n");
}
結果:
child
Parent
--------------程式碼3-----------------
pid = vfork() ;
if (pid ==0 )
{
printf("child\n");
return 0;
}
else
{
printf("Parent\n");
}
結果:
child
Parent
程式記憶體區段錯誤 (core dumped)
更新1:
我是在Ubuntu寫的程式
更新2:
在使用vfork時 parent process會停止執行 直到child process結束後才執行 那麼這樣的話要如何達到concurrent? 比如我有一個socket的程式 server端要有一個parent process在那listen 然後當accept時則需要使用vfork(假設沒有fork可以用)產生另一新 child process 那parent process這時候就暫停了 這段期間就無法accept新的connection
更新3:
另外一個問題,vfork的parent 和child 都使用同一況address space 那vfork的效果是否跟等價於pthread?