我正在实现一个库。我只能修改文件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