From owner-freebsd-questions@FreeBSD.ORG Sat Oct 31 15:55:33 2009 Return-Path: Delivered-To: freebsd-questions@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DB0791065679 for ; Sat, 31 Oct 2009 15:55:33 +0000 (UTC) (envelope-from kris@FreeBSD.org) Received: from kennaway-macbookpro.config (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 3E4998FC19; Sat, 31 Oct 2009 15:55:33 +0000 (UTC) Message-ID: <4AEC5E02.8040705@FreeBSD.org> Date: Sat, 31 Oct 2009 15:55:46 +0000 From: Kris Kennaway User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Peter Steele References: <7B9397B189EB6E46A5EE7B4C8A4BB7CB327D117F@MBX03.exg5.exghost.com> In-Reply-To: <7B9397B189EB6E46A5EE7B4C8A4BB7CB327D117F@MBX03.exg5.exghost.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: "freebsd-questions@freebsd.org" Subject: Re: system() call causes core dump X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 31 Oct 2009 15:55:33 -0000 Peter Steele wrote: > I have an application running a number of threads. I've had recent instances where the code below is causing a core dump to occur: > > char fstatCmd[200]; > char *fstatOut = "/tmp/fstat.out"; > sprintf(fstatCmd, "fstat | grep -v USER | wc -l >%s", fstatOut); > rc = system(fstatCmd); > > The call is simply intended to get a count of the current open handles. The system call though causes a core: > > #0 0x0000000801058307 in _spinunlock () from /lib/libthr.so.3 > #1 0x00000008011d0afb in _malloc_postfork () from /lib/libc.so.7 > #2 0x000000080105c5fb in fork () from /lib/libthr.so.3 > #3 0x0000000801191aae in system () from /lib/libc.so.7 > #4 0x00000008010553aa in system () from /lib/libthr.so.3 > #5 0x000000000040b6f9 in mythread at myapp.c:461 > #6 0x0000000801056a88 in pthread_getprio () from /lib/libthr.so.3 > > There appears to be some kind of thread-safe issue going on. I have a number of threads that are monitoring various items, waking up a differing intervals to do their respective tasks. Do I need to put in a global mutex so that the threads never attempt to make simultaneous system() calls? Curiously, only this particular system() call appears to be causing a core. In UNIX it is not safe to perform arbitrary actions after forking a multi-threaded process. You're basically expected to call exec soon after the fork, although you can do certain other work if you are very careful. The reason for this is that after the fork, only one thread will be running in the child, and if that thread tries to acquire a lock or other formerly-shared resource it may deadlock or crash, because the child process is no longer accessing the same memory location as the threads in the parent process (it gets a separate copy of the address space at the time of fork, which may not be in a consistent state from the point of view of the thread library). Kris