3 #include <sys/resource.h>
4 #include "threadimpl.h"
11 static int threadpassfd = -1;
12 static int gotsigchld;
20 notedisable("sys: child");
21 pid = waitpid(sigpid, &status, 0);
23 fprint(2, "%s: wait: %r\n", argv0);
27 _exit(WEXITSTATUS(status));
28 if(WIFSIGNALED(status)){
30 * Make sure we don't scribble over the nice
31 * core file that our child just wrote out.
35 setrlimit(RLIMIT_CORE, &rl);
37 signal(WTERMSIG(status), SIG_DFL);
38 raise(WTERMSIG(status));
39 _exit(98); /* not reached */
41 if(WIFSTOPPED(status)){
42 fprint(2, "%s: wait pid %d stopped\n", argv0, pid);
46 if(WIFCONTINUED(status)){
47 fprint(2, "%s: wait pid %d continued\n", argv0, pid);
51 fprint(2, "%s: wait pid %d status 0x%ux\n", argv0, pid, status);
71 SIGHUP, SIGINT, SIGQUIT, SIGILL,
72 SIGTRAP, SIGABRT, SIGBUS, SIGFPE,
73 SIGUSR1, SIGSEGV, SIGUSR2, SIGPIPE,
74 SIGALRM, SIGTERM, SIGCHLD, SIGSTOP,
75 /*SIGTSTP, SIGTTIN, SIGTTOU,*/ SIGURG,
76 SIGXCPU, SIGXFSZ, SIGVTALRM, SIGPROF,
96 _threadsetupdaemonize(void)
105 * We've been told this program is likely to background itself.
106 * Put it in its own process group so that we don't get a SIGHUP
107 * when the parent exits.
112 sysfatal("passer pipe: %r");
114 /* hide these somewhere they won't cause harm */
115 /* can't go too high: NetBSD max is 64, for example */
116 if(dup(p[0], 28) < 0 || dup(p[1], 29) < 0)
117 sysfatal("passer pipe dup: %r");
124 if(fcntl(p[0], F_SETFD, 1) < 0 || fcntl(p[1], F_SETFD, 1) < 0)
125 sysfatal("passer pipe pipe fcntl: %r");
127 noteenable("sys: child");
128 signal(SIGCHLD, sigpass);
129 switch(pid = fork()){
131 sysfatal("passer fork: %r");
136 notedisable("sys: child");
137 signal(SIGCHLD, SIG_DFL);
138 /* rfork(RFNOTEG); */
148 for(i=0; i<nelem(sigs); i++){
151 memset(&sa, 0, sizeof sa);
152 sa.sa_handler = sigpass;
153 sa.sa_flags |= SA_RESTART;
154 sigaction(sigs[i], &sa, nil);
158 n = read(p[0], buf, sizeof buf-1);
159 if(n == 0){ /* program exited */
164 print("passer read: %r\n");
171 _threaddaemonize(void)
174 sysfatal("threads in main proc exited w/o threadmaybackground");
175 write(threadpassfd, "0", 1);