#pragma interface #include #include class Program { protected: int pid, status; virtual void beforeExec(); // called between fork and exec virtual void childExit(int stat); // called when child exits virtual void childStop(int sig); // called when child stops int suid, sgid; private: Array fd; Array env; Program *next; static Program *first; static Program *remove(int pid); struct Waiter; public: Program(); Program &runAs(int uid,int gid) { suid = uid; sgid = gid; return *this; } Program &setfd(int fd,int dupfd); Program &resetfd(); // clear fd map int pipein(int fd); int pipeout(int fd); Program &input(int f,const char *fname); Program &output(int fd,const char *fname); Program &append(int fd,const char *fname); Program &operator<(const char *fname) { return input(0,fname); } Program &operator>(const char *fname) { return output(1,fname); } Program &operator>>(const char *fname) { return append(1,fname); } Program &setenv(const char *envstr); int run(const char *cmd); int run(const char *prog,const char * const *argv); int wait(); static Program *post(int pid,int status); static Program *find(int pid); ~Program(); }; /* Program pgm; pgm.input(0,"testfile").output(1,"test.out").append(2,"errs"); */