#include #include #include #include #include #include #include void Fatal(const char *Msg) { perror(Msg); exit(1); } volatile sig_atomic_t SigttouHandled=0; void SigttouHandler(int Arg) { SigttouHandled=1; } int main(int argc, char *argv[]) { pid_t ChildPid=fork(); if(ChildPid==0) { #if 1 if(signal(SIGTTOU, SIG_IGN)==SIG_ERR) Fatal("ignoring SIGTTOU"); #elif 0 if(signal(SIGTTOU, SIG_DFL)==SIG_ERR) Fatal("defaulting SIGTTOU"); #else if(signal(SIGTTOU, SigttouHandler)==SIG_ERR) Fatal("SIGTTOU handler setup"); #endif if(setpgid(0,0)) Fatal("setpgid()"); int Fd=open(ctermid(NULL), O_RDONLY); if(Fd<0) Fatal("open(ctermid(),))"); if(tcsetpgrp(Fd, getpgid(0))) Fatal("tcsetpgrp()"); printf("child done\n"); } else if(ChildPid<0) Fatal("fork()"); else { int ChildStatus; if(wait(&ChildStatus)<0) Fatal("wait()"); if(WIFCONTINUED(ChildStatus)) printf("child has continued\n"); else if(WIFEXITED(ChildStatus)) printf("child has exited\n"); else if(WIFSIGNALED(ChildStatus)) printf("child was terminated\n"); else if(WIFSTOPPED(ChildStatus)) printf("child was stoped\n"); printf("End of parent process\n"); } return 0; }