2016-05-23 121 views
3

正如我們所知,exec系列函數調用最終會調用execve()這是一個系統調用,剩餘的是庫函數。因此,通常,execve()適用於其他exec*()函數也是如此。C中的exec系列函數

我想知道,在執行execve()時,是否所有的信號都被阻塞直到成功,或者是否有辦法將信號傳遞給對應於exec的pid? (我知道它不會在成功時返回,並且調用函數的進一步執行不會發生)

+2

不確定你在問什麼;你能提供一些僞代碼來說明你在問什麼嗎? – csl

+0

@csl我的問題很簡單直接,execve(或任何exec函數)阻止所有信號,直到它完成? – theartist33

+0

查看http://unix.stackexchange.com/questions/16455/interruption-of-system-calls-when-a-signal-is-caught – csl

回答

4

我不確定我的問題是否正確,因此如果我錯了,請隨時糾正。

但是,基本上,是的,從流程的角度來看,系統調用可以被視爲'原子'。因此,一旦啓動了系統調用,只有內核已經啓動,它將不會釋放該進程,直到運行新命令或出錯代碼失敗或者提高SIGKILL信號(因爲SIGKILL是唯一不可阻止的信號)。

但是,一旦execve()產生了一個新的進程(並從內核返回),它完全可以與任何信號中斷。

+0

我的問題很簡單直接,execve(或任何exec函數)阻止所有信號,直到完成? – theartist33

+0

是的。因爲它位於內核空間(不在用戶空間中)。 – perror

+0

那麼如何結束/終止執行功能被卡住(掛起)而不會從其他上下文中終止進程ID? – theartist33