1 |
ab11 |
1.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 |