Follow-up Comment #5, bug #97269 (project xrootd): Wait. I have found the small test program that I have written when I was originally writing this forking functionality for CMS, and it works exactly as expected and documented: ]==> cat fork_somewhat_better.cc #include <iostream> #include <pthread.h> #include <unistd.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void *locker_thread( void * ) { std::cout << "Locker - locking the mutex" << std::endl; int st = pthread_mutex_lock( &mutex ); std::cout << "Locker - locked the mutex: " << st << std::endl; sleep( 5 ); std::cout << "Locker - unlocking the mutex" << std::endl; st = pthread_mutex_unlock( &mutex ); std::cout << "Locker - unlocked the mutex: " << st << std::endl; sleep( 5 ); } void prepare() { std::cout << "Prepare [" << getpid() << "]: atfork - locking the mutex" << std::endl; int st = pthread_mutex_lock( &mutex ); std::cout << "Prepare [" << getpid() << "]: atfork - locked the mutex: " << st << std::endl; } void child() { std::cout << "Child [" << getpid() << "]: atfork - unlocking the mutex" << std::endl; int st = pthread_mutex_unlock( &mutex ); std::cout << "Child [" << getpid() << "]: atfork - unlocked the mutex: " << st << std::endl; } void parent() { std::cout << "Parent [" << getpid() << "]: atfork - unlocking the mutex" << std::endl; int st = pthread_mutex_unlock( &mutex ); std::cout << "Parent [" << getpid() << "]: atfork - unlocked the mutex: " << st << std::endl; } int main( int argc, char **argv ) { std::cout << "Parent start." << std::endl; pthread_atfork( prepare, parent, child ); // <-- atfork pthread_t thread; pthread_create( &thread, 0, locker_thread, 0 ); sleep( 1 ); // child if( fork() == 0 ) { std::cout << "Child forked" << std::endl; std::cout << "Child: trying to lock the mutex" << std::endl; int st = pthread_mutex_lock( &mutex ); std::cout << "Child: mutex locked: " << st << std::endl; } // parent else { std::cout << "Parent: trying to lock the mutex" << std::endl; int st = pthread_mutex_lock( &mutex ); std::cout << "Parent: mutex locked: " << st << std::endl; std::cout << "Parent: waiting for the thread" << std::endl; pthread_join( thread, 0 ); } return 0; }; ]==> ./a.out Parent start. Locker - locking the mutex Locker - locked the mutex: 0 Prepare [2138]: atfork - locking the mutex Locker - unlocking the mutex Prepare [2138]: atfork - locked the mutex: 0 Child [2151]: atfork - unlocking the mutex Child [2151]: atfork - unlocked the mutex: 0 Child forked Child: trying to lock the mutex Child: mutex locked: 0 Parent [2138]: atfork - unlocking the mutex Parent [2138]: atfork - unlocked the mutex: 0 Parent: trying to lock the mutex Parent: mutex locked: 0 Parent: waiting for the thread Locker - unlocked the mutex: 0 The issue must be elsewhere... _______________________________________________________ Reply to this item at: <http://savannah.cern.ch/bugs/?97269> _______________________________________________ Message sent via/by LCG Savannah http://savannah.cern.ch/ ######################################################################## Use REPLY-ALL to reply to list To unsubscribe from the XROOTD-DEV list, click the following link: https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=XROOTD-DEV&A=1