1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
//
#ifndef _vdkchildtask_h
// put your code below here
#define _vdkchildtask_h
#include <vdk/vdkobj.h>
#include <vdk/value_sem_list.h>
#include <vdk/siglisthandle.h>
#include <vdk/vdkinchannel.h>
#define _GNU_SOURCE
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <sys/wait.h>
#define CHILD_TASK_DATA_SIGNAL (user_signal-1023)
#define CHILD_TASK_DIED_SIGNAL (user_signal-1022)
class VDKChildTask;
class VDKPid
{
public:
pid_t pid;
VDKChildTask* task;
VDKPid (pid_t pid = (pid_t) -1, VDKChildTask* task = NULL);
~VDKPid () {}
bool operator == (VDKPid& p)
{ return (pid == p.pid); }
bool operator < (VDKPid& p)
{ return (pid < p.pid); }
};
typedef VDKValueList <VDKPid> PIDLIST;
typedef VDKValueListIterator <VDKPid> PidListIterator;
class VDKChildTask: public VDKObject
{
private:
char* data_buffer;
static void reaper(int);
static void plumber(int);
pid_t pid;
int xmit;
static PIDLIST PidList;
protected:
bool DoIO (VDKObject*);
public:
VDKChildTask (VDKForm* owner);
virtual ~VDKChildTask ();
pid_t StartChild (char* args[], bool duplex = false);
char* GetData () { return data_buffer; }
bool SendData (char* buffer);
// hopefully converted into properties
inline int Pid() {return pid;}
inline void Pid(int p) {pid = p;}
inline int Xmit() {return pid;}
inline void Xmit(int x) {xmit = x;}
DECLARE_SIGNAL_LIST (VDKChildTask);
};
//
#endif
|