Я реализую библиотеку. Я могу изменить только файлы 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
осуществляется совместно используемой памяти, и есть семафоры и все, что должен быть включен ...)
У меня возникла проблема в следующем месте:
Псевдо код данной основной функции():
- отец называет
mylib_init()
- отец называет
mylib_exit()
- отец называет
mylib_init()
// второй раз - отца сделать
fork()
Потому что mylib_init()
называется дважды, pthread_atfork()
также называется дважды, и из-за этого сейчас на fork()
, функция my_prepare_fork()
называется дважды. => Номер p_using_mylib
будет неправильным, и это проблема.
Так что я хотел бы знать:
- Есть ли способ разрегистрировать
pthread_atfork()
, что было раньше? - Есть ли способ регистрации функции, только в первый раз, когда основной процесс рождается? В такой ситуации я мог бы включить в эту функцию инициализацию
pthread_atfork()
- Есть ли другой способ решить эту проблему?
Спасибо!
Почему не декремент 'p_using_mylib' в' mylib_exit() '? – alk
Причина: Я должен уменьшаться, когда процесс прекращает использование библиотеки с помощью 'mylib_exit()', а не когда процесс умирает (он может жить, а не использовать библиотеку), и я должен видеть это как «0» процессов с использованием библиотеки) – hudac