某些庫可能會使用pthread_atfork()
註冊一些處理程序。我不需要它們,因爲我只使用fork()
和exec()
。而且,在某些情況下它們可能會造成麻煩。那麼,有沒有辦法重置註冊的處理程序列表?如何重置由pthread_atfork註冊的處理程序
相關:calling fork()
without the atfork
handlers,fork()
async signal safety。
某些庫可能會使用pthread_atfork()
註冊一些處理程序。我不需要它們,因爲我只使用fork()
和exec()
。而且,在某些情況下它們可能會造成麻煩。那麼,有沒有辦法重置註冊的處理程序列表?如何重置由pthread_atfork註冊的處理程序
相關:calling fork()
without the atfork
handlers,fork()
async signal safety。
POSIX沒有記錄pthread_atfork()
安裝的fork處理程序被刪除的任何機制,無法終止進程或更換過程映像。如果你不想要它們,那麼不要安裝它們。如果它們是由第三方庫安裝的,如您所描述的那樣,那麼您的選擇是找到一種方法來避免庫的行爲(可能完全避免庫)或與之共存。
我讀過'UNREGISTER_ATFORK'。這是一個解決方案嗎? – Albert
你必須幫助我,@艾伯特。你從哪裏讀到的?據我所知,POSIX沒有爲任何實體指定這樣的標識符。它看起來像GLIBC可能有一個內部函數,其名稱與此類似,但如果是這樣,它不打算直接調用,並且它不可移植。 –
在[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
「atfork」處理程序主要記錄的操作問題涉及'fork()'被信號處理程序調用的情況,因此'atfork'處理程序在信號處理程序的上下文中被調用。這是你真的需要擔心的問題嗎? –