vfork使用return退出為什麼會掛掉

2021-09-26 04:12:06 字數 901 閱讀 8794

源**

為什麼呼叫return直接程式掛掉

首先說一下fork(和vfork()的區別:

man vfork檢視vfork()是怎麼工作的

我們知道了使子程序退出應該使用exit()而不是return,如果在main函式中return,這就意味著main函式直接return了,因為vfork()建立的子程序,父子程序共享資源,此時整個程式就已經結束

基本過程如下:

1. 子程序在main函式中return,於是函式的呼叫棧發生了變化

2. 而在main函式中return以後,通常會呼叫exit()或相似函式(如:_exit())

3. 這時父程序收到子程序exit(),開始執行vfork()返回,但是老子的函式棧都被你子程序用return給幹了廢掉了,我怎麼執行,(棧會返回乙個詭異的棧位址,對於某些核心版本直接報"棧錯誤"返回,而某些核心版本,於是可能會呼叫main(),於是陷入乙個無限迴圈的結果,直到vfork(),呼叫返回error)

子程序正常呼叫exit(),沒有修改函式棧,所以父程序可以順利執行

但是exit我們知道是會重新整理緩衝區的並close所有的i/o,這樣會導致父程序收到影響,所以正確的呼叫方法就是呼叫_exit()函式

本文參考自:

vfork不是用return返回的原因

首先看一下 int main void else if pid 0 printf pid d,glob d,var d n getpid glob,var return 0 我們會發現即使子程序return後,父程序並沒有正常退出,而是繼續建立子程序,進入了乙個死迴圈。而在子程序中使用exit則可以...

try catch 以及return 的使用

public class ectest public static string testreturn catch exception e return hhe 這裡返回的是e.getmessage 的內容,如果catch裡面有return 就返回 public static string test...

PostgreSQL psql的使用與退出

postgresql在安裝時自帶了pgadmin和psql,pgadmin是視覺化工具,psql是命令列工具。雖然pgadmin操作起來會更加直觀簡單,但是在restore和backup db的時候,效率和效能會比較低下,如果db過於龐大,還會導致pgadmin記憶體溢位。推薦使用psql來連線資料...