我正在實現一個庫。我只能修改文件mylib.c
,mylib.h
,而不是其他文件中的main()
。pthread_atfork()多次調用導致fork()函數被多次調用後
當main()中的進程調用mylib_init()
時,可以開始使用mylib.h, mylib.c
函數。
當進程調用mylib_exit()
時,他不能再使用mylib.h, mylib.c
函數。
我要計數的進程數當前使用mylib
庫,所以裏面mylib_init()
有一個
pthread_atfork(my_prepare_fork, NULL, NULL);
my_prepare_fork() {
p_using_mylib ++;
}
(雖然通過共享內存實現p_using_mylib
,並有信號燈和一切應包括...)
我在下次碰到問題時遇到問題:
一個給定的main()函數的僞代碼:
- 父親叫
mylib_init()
- 父親叫
mylib_exit()
- 父親叫
mylib_init()
//第二次 - 父親做
fork()
因爲mylib_init()
調用了兩次,pthread_atfork()
也調用了兩次,並且因爲那現在在fork()
,函數my_prepare_fork()
被調用兩次。 =>p_using_mylib
的號碼將不正確,這是問題所在。
所以我想知道:
- 有什麼辦法來註銷
pthread_atfork()
那是以前? - 是否有任何註冊函數的方法,僅在主進程第一次出現?在這樣的情況下,我可以通過這個函數初始化
pthread_atfork()
- 有沒有另一種方法可以解決這個問題?
謝謝!
爲什麼不在'mylib_exit()'中減少'p_using_mylib'? – alk 2013-03-08 07:19:40
原因當進程停止使用帶有mylib_exit()的庫時,應該減量,而不是在進程死亡時(他可以活着,不使用庫 - 我應該看到使用庫的'0'進程) – hudac 2013-03-08 09:21:34