diff --git a/src/common/rclinit.cpp b/src/common/rclinit.cpp index e753e1b0..1a37928f 100644 --- a/src/common/rclinit.cpp +++ b/src/common/rclinit.cpp @@ -1,5 +1,5 @@ #ifndef lint -static char rcsid[] = "@(#$Id: rclinit.cpp,v 1.9 2007-05-21 13:30:21 dockes Exp $ (C) 2004 J.F.Dockes"; +static char rcsid[] = "@(#$Id: rclinit.cpp,v 1.10 2007-05-23 08:28:35 dockes Exp $ (C) 2004 J.F.Dockes"; #endif /* * This program is free software; you can redistribute it and/or modify @@ -41,12 +41,10 @@ RclConfig *recollinit(RclInitFlags flags, // must check write() return values. signal(SIGPIPE, SIG_IGN); - // We block SIGCLD globally. We intend to properly wait for our children - sigset_t sset; - sigemptyset(&sset); - sigaddset(&sset, SIGCHLD); - pthread_sigmask(SIG_BLOCK, &sset, 0); + // We would like to block SIGCHLD globally, but we can't because + // QT uses it. Have to block it inside execmd.cpp + // Install signal handler if (sigcleanup) { for (unsigned int i = 0; i < sizeof(catchedSigs) / sizeof(int); i++) if (signal(catchedSigs[i], SIG_IGN) != SIG_IGN) diff --git a/src/utils/execmd.cpp b/src/utils/execmd.cpp index 5a6741f8..4333603f 100644 --- a/src/utils/execmd.cpp +++ b/src/utils/execmd.cpp @@ -1,5 +1,5 @@ #ifndef lint -static char rcsid[] = "@(#$Id: execmd.cpp,v 1.23 2007-05-21 13:30:22 dockes Exp $ (C) 2004 J.F.Dockes"; +static char rcsid[] = "@(#$Id: execmd.cpp,v 1.24 2007-05-23 08:28:35 dockes Exp $ (C) 2004 J.F.Dockes"; #endif /* * This program is free software; you can redistribute it and/or modify @@ -180,6 +180,11 @@ int ExecCmd::doexec(const string &cmd, const list& args, if (e.pid) { // Father process + sigset_t blkcld; + sigemptyset(&blkcld); + sigaddset(&blkcld, SIGCHLD); + pthread_sigmask(SIG_BLOCK, &blkcld, 0); + if (input) { close(e.pipein[0]); e.pipein[0] = -1; @@ -280,6 +285,8 @@ int ExecCmd::doexec(const string &cmd, const list& args, e.pid = -1; } LOGDEB1(("ExecCmd::doexec: father got status 0x%x\n", status)); + pthread_sigmask(SIG_UNBLOCK, &blkcld, 0); + return haderror ? -1 : status; } else {