我安裝了一個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 /線程安全/異步信號安全/。
對不起,但如果你的應用程序應該在許多平臺上運行,我看不出如何調用依賴於平臺的'系統調用() '會幫你輕鬆點... –
爲什麼不寫一個'fork()'的封裝器來鎖定/解鎖調用周圍的互斥鎖,因此它變得線程安全? – Shahbaz
據我瞭解你鏈接的錯誤,如果你從信號處理程序調用'fork',而不是從不同的線程調用相關。也就是說,'fork()'不是異步信號安全的。沒有提到它不是線程安全的。你有這個bug嗎?或者你只是特別小心? – rodrigo