2012-07-02 58 views
2

我安裝了一個SIGSEV和SIGABRT信號處理程序,它分派一個子進程: 1.用SIGSTOP停止它的父進程。 2.在父進程上調用gdb來收集崩潰診斷信息。如何直接調用fork(),繞過libc?

問題是,fork is not async signal safe on glibc感謝ptmalloc安裝pthread_atfork處理程序。現在我的信號處理程序有可能會凍結,因爲fork()試圖分配內存,這反過來可能會獲取已鎖定的互斥鎖。

我想通過直接調用fork系統調用繞過任何libc包裝並繞過任何atfork處理程序來解決此問題。我怎麼做?以下代碼適用於Linux,但在OS X上似乎不起作用。它始終返回子PID,從不爲0,或者它應該這樣做?我也不確定是否正確捕獲返回值,因爲定義是int syscall(...),但fork返回類型爲pid_t的整數。修正錯字:

pid = syscall(SYS_fork); 

我的應用程序在許多平臺上,包括Linux和OS X.

EDIT運行S /線程安全/異步信號安全/。

+1

對不起,但如果你的應用程序應該在許多平臺上運行,我看不出如何調用依賴於平臺的'系統調用() '會幫你輕鬆點... –

+0

爲什麼不寫一個'fork()'的封裝器來鎖定/解鎖調用周圍的互斥鎖,因此它變得線程安全? – Shahbaz

+1

據我瞭解你鏈接的錯誤,如果你從信號處理程序調用'fork',而不是從不同的線程調用相關。也就是說,'fork()'不是異步信號安全的。沒有提到它不是線程安全的。你有這個bug嗎?或者你只是特別小心? – rodrigo

回答

0

在Linux上,如果你只是想自動開火軟件核心調試器傾銷的信號,你可以讓你的核心轉儲管道到一些腳本,根據core(5)你只需要一個|(管道字符隨後啓動coredump_filter通過命令)。

這一招可避免任何額外的編程(除您爲腳本)