2017-10-18 155 views
0

某些庫可能會使用pthread_atfork()註冊一些處理程序。我不需要它們,因爲我只使用fork()exec()。而且,在某些情況下它們可能會造成麻煩。那麼,有沒有辦法重置註冊的處理程序列表?如何重置由pthread_atfork註冊的處理程序

相關:calling fork() without the atfork handlers,fork() async signal safety

+0

「atfork」處理程序主要記錄的操作問題涉及'fork()'被信號處理程序調用的情況,因此'atfork'處理程序在信號處理程序的上下文中被調用。這是你真的需要擔心的問題嗎? –

回答

0

POSIX沒有記錄pthread_atfork()安裝的fork處理程序被刪除的任何機制,無法終止進程或更換過程映像。如果你不想要它們,那麼不要安裝它們。如果它們是由第三方庫安裝的,如您所描述的那樣,那麼您的選擇是找到一種方法來避免庫的行爲(可能完全避免庫)或與之共存。

+0

我讀過'UNREGISTER_ATFORK'。這是一個解決方案嗎? – Albert

+0

你必須幫助我,@艾伯特。你從哪裏讀到的?據我所知,POSIX沒有爲任何實體指定這樣的標識符。它看起來像GLIBC可能有一個內部函數,其名稱與此類似,但如果是這樣,它不打算直接調用,並且它不可移植。 –

+0

在[Glibc'fork.h'](https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/generic/fork.h;h=623cae28dfa22d00ed09b8842ca36f44f733942c;hb=HEAD ),它說UNREGISTER_ATFORK,如果定義它必須擴展到一個函數調用,該函數調用需要一個void *參數,該參數是卸載DSO的DSO句柄。所謂的函數必須刪除此模塊註冊的atfork處理程序。我看到一些C++ stdlib實現使用它。 – Albert

相關問題