2011-03-12 46 views
0

即時通訊新的C++中,我想知道什麼時候我們需要在我們的程序中使用信號處理?我看到了一些代碼,他們設置信號後叉,什麼叉意味着在這裏?在c + +中的信號處理

TIA

回答

4

我強烈推薦這本書Advanced Programming in the Unix Environment, 2nd Edition作爲指南,以系統編程。

fork(2)產生一個新的過程;它幾乎完全是當前流程的一個克隆。但差異很大:父母和子女的fork(2)的返回值不同,孩子有一個新的pid,新的ppid,並且其子標記爲FD_CLOEXEC的所有文件描述符都將在孩子中關閉(有關詳細信息,請參閱fcntl(2))。還有其他的區別,但這是一個好的開始。

當設置信號處理程序,要記住最重要的事情:使用sigaction(2)安裝信號處理程序,不signal(3)signal(3)是不可靠的,並允許丟失信號。 你不能做太多。您可以在信號處理程序中調用的允許功能的列表位於signal(7)聯機幫助頁中。使用該列表之外的功能是危險的,並且可能會產生一些非常困難的錯誤。您還可以在程序中設置由主事件循環檢查的標誌,以便在適當的時候乾淨地退出或打印狀態或重新加載配置文件。

+0

所以我們用叉子避免崩潰或凍結,是嗎?當我們使用信號處理?謝謝 – Arash 2011-03-12 07:31:44

+1

@arash,'叉(2)'可產卵子進程的唯一機制。正如@Colin所說,每個shell在啓動新程序時都會調用fork()。 (但不是因爲他說的原因:)在線程在Unix平臺上廣泛使用之前,'fork(2)'是並行計算任務以利用多個CPU或允許程序員使用更簡單的阻塞IO接口的主要機制。 'fork()'仍然是用於產生一個新的子程序的唯一接口,在普通的'fork(2)+ exec'成語中。 (有關詳細信息,請參閱'execle(3)'和'execve(2)'手冊頁) – sarnold 2011-03-12 07:47:43

+1

@arash,信號處理用於當用戶點擊「^ C」或想要重新加載使用'kill $(pidof ushare)SIGHUP'或類似命令配置,或使用'SIGIO'驅動的異步IO操作(有關詳細信息,請參見'open(2)'中的'O_ASYNC'標誌),在死亡孩子之後清理'wait4(2)'和'wait(2)'manpages),或者想要非常簡單地與其他進程協調任務。 – sarnold 2011-03-12 07:52:17

1

Fork是C語言中的一個內置函數,它使程序創建自己的子實例,該實例在fork被調用的位置開始執行。在運行命令之前分離shell,這是很好的,因爲如果命令導致崩潰或凍結,程序的分叉實例可以在保持父項活着的情況下被殺死。

+2

'fork()'不是「C中的內置函數」。 'fork()'在[posix規範](http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html)(及更早版本,也是以unix爲中心的規範)中定義。在[C99標準](http://www.open-std.org/JTC1/SC22/WG14/www/standards.html#9899)或任何其他C標準中未指定'fork()'。 – sarnold 2011-03-12 07:29:14

+0

所以我們使用fork來避免崩潰或凍結,是的?當我們使用信號處理?謝謝 – Arash 2011-03-12 07:30:46