00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __PROCESS_H
00025 #define __PROCESS_H
00026
00027 #if !defined(_REENTRANT)
00028 # define _REENTRANT
00029 #endif
00030 #include <unistd.h>
00031 #include <signal.h>
00032
00033 #include <stlib/Object.h>
00034 #include <stlib/Array.h>
00035 #include <stlib/Set.h>
00036
00037 #include <stlib/Callback0.h>
00038 #include <stlib/Callback1.h>
00039
00040 namespace OS {
00041
00049 class Process : public Core::Object
00050 {
00051 private:
00052 static bool has_handler;
00053
00054 protected:
00055 Callback<void> *_receiver;
00056 Array *_arguments;
00057
00058 int process_id;
00059 int _status;
00060 bool runningProcess;
00061
00062 static Set processes;
00063
00064 protected:
00065 Process(void);
00066
00067 public:
00068 Process(Callback<void> *receiver, Array *args = nil);
00073 virtual ~Process(void);
00074
00075
00076 static Process *fork(Callback<void> *receiver);
00077 static Process *fork(Callback<void> *receiver, Array *args);
00078
00079 template <class TReceiver>
00080 static Process *fork(TReceiver *receiver, void (TReceiver::*execFunc)(void))
00081 {
00082 Callback0<TReceiver,void> *callback;
00083 callback = new Callback0<TReceiver,void>(receiver, execFunc);
00084 return fork(callback);
00085 }
00086
00087 template <class TReceiver>
00088 static Process *fork(TReceiver *receiver, void (TReceiver::*execFunc)(Array *),
00089 Array *args)
00090 {
00091 Callback1<TReceiver,void,Array*> *callback;
00092 callback = new Callback1<TReceiver,void,Array*>(receiver, execFunc);
00093 return fork(callback, args);
00094 }
00095
00104 static Process *forkJob(String *progName, SequenceableCollection *args = nil,
00105 SequenceableCollection *fds = nil);
00106
00107 static void finalizeProcesses(void);
00108
00109
00110 virtual void arguments(Array *args);
00111 virtual void receiver(Callback<void> *obj);
00112 virtual int status(void);
00113
00114
00115 virtual void resume(void);
00116 virtual void run(void);
00117 virtual void finalize(void);
00118 virtual void suspend(void);
00119 virtual void terminate(void);
00120 virtual void yield(void);
00121
00122
00123 virtual bool isRunning(void);
00124
00125
00126 virtual void childSignaled(void);
00127
00128 private:
00129 void privateExecuteJob(Array *args);
00130 static void sigchildHandler(int signum);
00131 };
00132
00133 };
00134
00135 #endif