1 |
// Fork.h -*- C++ -*- socket library |
2 |
// Copyright (C) 1992,1993,1994 Gnanasekaran Swaminathan <gs4t@virginia.edu> |
3 |
// |
4 |
// Permission is granted to use at your own risk and distribute this software |
5 |
// in source and binary forms provided the above copyright |
6 |
// notice and this paragraph are preserved on all copies. |
7 |
// This software is provided "as is" with no express or implied warranty. |
8 |
// |
9 |
// Version: 17Oct95 1.10 |
10 |
|
11 |
#ifndef FORK_H |
12 |
#define FORK_H |
13 |
|
14 |
#include <unistd.h> |
15 |
#include <sys/types.h> |
16 |
#include <sys/signal.h> |
17 |
|
18 |
class Fork { |
19 |
public: |
20 |
class KillForks { |
21 |
public: |
22 |
KillForks () {} |
23 |
~KillForks (); |
24 |
}; |
25 |
|
26 |
class ForkProcess { |
27 |
friend Fork::KillForks::~KillForks (); |
28 |
|
29 |
static void infanticide_reason (pid_t pid, int status); |
30 |
static void reaper_nohang (int); |
31 |
|
32 |
static ForkProcess* list; |
33 |
public: |
34 |
pid_t pid; |
35 |
const char kill_child; |
36 |
const char reason; |
37 |
ForkProcess* next; |
38 |
|
39 |
ForkProcess (int kill, int give_reason); |
40 |
~ForkProcess (); |
41 |
|
42 |
void kill_process () const; |
43 |
void reap_child () const; |
44 |
|
45 |
static void commit_suicide (int); |
46 |
}; |
47 |
private: |
48 |
static KillForks killall; |
49 |
|
50 |
ForkProcess* process; |
51 |
|
52 |
Fork (Fork&); // no copy constructor definition provided |
53 |
Fork& operator = (Fork&); // no assignment operator definition provided |
54 |
public: |
55 |
Fork (int kill = 0, int reason = 0) |
56 |
: process (new ForkProcess (!!kill, !!reason)) {} |
57 |
~Fork (); |
58 |
|
59 |
int is_child () const { return process->pid == 0; } |
60 |
int is_parent () const { return process->pid > 0; } |
61 |
int process_id () const { return process->pid; } |
62 |
|
63 |
static void suicide_signal (int signo = SIGTERM); |
64 |
}; |
65 |
|
66 |
#endif // FORK_H |