2013-03-08 7 views
0

Я реализую библиотеку. Я могу изменить только файлы 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 осуществляется совместно используемой памяти, и есть семафоры и все, что должен быть включен ...)

У меня возникла проблема в следующем месте:

Псевдо код данной основной функции():

  1. отец называет mylib_init()
  2. отец называет mylib_exit()
  3. отец называет mylib_init() // второй раз
  4. отца сделать fork()

Потому что mylib_init() называется дважды, pthread_atfork() также называется дважды, и из-за этого сейчас на fork(), функция my_prepare_fork() называется дважды. => Номер p_using_mylib будет неправильным, и это проблема.

Так что я хотел бы знать:

  1. Есть ли способ разрегистрировать pthread_atfork(), что было раньше?
  2. Есть ли способ регистрации функции, только в первый раз, когда основной процесс рождается? В такой ситуации я мог бы включить в эту функцию инициализацию pthread_atfork()
  3. Есть ли другой способ решить эту проблему?

Спасибо!

+0

Почему не декремент 'p_using_mylib' в' mylib_exit() '? – alk

+0

Причина: Я должен уменьшаться, когда процесс прекращает использование библиотеки с помощью 'mylib_exit()', а не когда процесс умирает (он может жить, а не использовать библиотеку), и я должен видеть это как «0» процессов с использованием библиотеки) – hudac

ответ

1

Невозможно «отменить регистрацию» pthread_atfork функций. Вы должны использовать pthread_once, чтобы защитить все процедуры типа инициализации от запуска более одного раза.

+0

Удивительно, спасибо! – hudac

Смежные вопросы