c6d78c69 |
1 | // @(#)root/eve:$Id$ |
2 | // Author: Matevz Tadel 2007 |
3 | |
4 | /************************************************************************** |
5 | * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. * |
6 | * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for * |
7 | * full copyright notice. * |
8 | **************************************************************************/ |
9 | |
93624d6b |
10 | #include "AliChildProcTerminator.h" |
c6d78c69 |
11 | |
12 | #include <sys/wait.h> |
d42184d7 |
13 | #include <signal.h> |
c6d78c69 |
14 | |
15 | //______________________________________________________________________________ |
93624d6b |
16 | // Full description of AliChildProcTerminator |
c6d78c69 |
17 | // |
18 | |
93624d6b |
19 | ClassImp(AliChildProcTerminator) |
c6d78c69 |
20 | |
93624d6b |
21 | AliChildProcTerminator* AliChildProcTerminator::fgTheOne = 0; |
c6d78c69 |
22 | |
93624d6b |
23 | AliChildProcTerminator* AliChildProcTerminator::Instance() |
c6d78c69 |
24 | { |
25 | if (fgTheOne == 0) |
93624d6b |
26 | fgTheOne = new AliChildProcTerminator; |
c6d78c69 |
27 | return fgTheOne; |
28 | } |
29 | |
93624d6b |
30 | AliChildProcTerminator::AliChildProcTerminator() |
c6d78c69 |
31 | { |
32 | struct sigaction sac; |
33 | sac.sa_handler = sig_handler; |
34 | sigemptyset(&sac.sa_mask); |
35 | sac.sa_flags = 0; |
07f75a04 |
36 | |
37 | // The sa_restorer field is Not POSIX and obsolete. |
38 | // This is for compilation on other systems |
39 | #if defined(__linux) && \ |
40 | (defined(__i386__) || defined(__x86_64__)) && \ |
41 | defined(__GNUC__) |
42 | sac.sa_restorer= NULL; |
43 | #endif |
44 | |
c6d78c69 |
45 | sigaction(SIGCHLD, &sac, 0); |
46 | } |
47 | |
93624d6b |
48 | void AliChildProcTerminator::sig_handler(int /*sig*/) |
c6d78c69 |
49 | { |
50 | int status; |
51 | pid_t pid = wait(&status); |
93624d6b |
52 | Instance()->ChildProcTerm(pid, status); |
c6d78c69 |
53 | } |
54 | |
93624d6b |
55 | void AliChildProcTerminator::ChildProcTerm(Int_t pid, Int_t status) |
c6d78c69 |
56 | { |
d2a137c1 |
57 | if (pid < 0) return; |
58 | |
c6d78c69 |
59 | Long_t args[2]; |
60 | args[0] = (Long_t) pid; |
61 | args[1] = (Long_t) status; |
62 | |
93624d6b |
63 | Emit("ChildProcTerm(Int_t,Int_t)", args); |
c6d78c69 |
64 | } |