This is the mail archive of the mailing list for the glibc project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: pthreads, fork+exec, and deadlocks

* Roland McGrath <> [030910 14:15]:
> > After fork(), I want to close all file descriptors, endpwent(),
> > closelog(), manage stdio/stderr/stdin etc. properly before doing the
> > exec().
> Probably all these descriptors should have FD_CLOEXEC set so the right
> thing happens automatically at exec.

The problem is not specifically with closing file descriptors.

The particular problem I'm seeing is with syslog_lock.

If another thread is writing to syslog when the fork happens, the
syslog_lock mutex is cloned in a locked state. 

A child can never reliably call any syslog functions.  Is this
intended?  I can certainly work around this.

Attached is test.c.  It's a simple program which starts a bunch of threads,
which just do syslog(...) fork().

The fork()ed child simply does syslog(...); _exit(0);

pstree -p 22305

All the children are "stuck" on the syslog_lock mutex.

gdb attached to a fork()ed child (22318): 
	0x42028d69 in sigsuspend () from /lib/i686/
	(gdb) bt
	#0  0x42028d69 in sigsuspend () from /lib/i686/
	#1  0x40037108 in __pthread_wait_for_restart_signal () from /lib/i686/
	#2  0x40039480 in __pthread_alt_lock () from /lib/i686/
	#3  0x40035f87 in pthread_mutex_lock () from /lib/i686/
	#4  0x420d660f in vsyslog () from /lib/i686/
	#5  0x420d617f in syslog () from /lib/i686/
	#6  0x08048781 in slave (unused=0x8049b98) at test.c:41
	#7  0x40035941 in pthread_start_thread () from /lib/i686/

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]