16 job_handler(int sig, siginfo_t *si, void *ctx)
21 if (si->si_code == CLD_STOPPED) {
22 printf("%d: stop received\n", si->si_pid);
24 kill(si->si_pid, SIGCONT);
25 } else if (si->si_code == CLD_EXITED) {
26 printf("%d: exit received\n", si->si_pid);
27 ret = waitpid(si->si_pid, &status, 0);
30 if (!WIFEXITED(status))
31 errx(1, "!WIFEXITED(status)");
33 } else if (si->si_code == CLD_CONTINUED) {
34 printf("%d: cont received\n", si->si_pid);
40 job_control_test(void)
46 sigemptyset(&sa.sa_mask);
47 sa.sa_flags = SA_SIGINFO;
48 sa.sa_sigaction = job_handler;
49 sigaction(SIGCHLD, &sa, NULL);
56 printf("child %d\n", getpid());
57 kill(getpid(), SIGSTOP);
62 while (!(cont_received && stop_received && exit_received)) {
67 if (!(cont_received && stop_received && exit_received))
68 errx(1, "job signals lost");
70 printf("job control test OK.\n");
74 rtsig_handler(int sig, siginfo_t *si, void *ctx)
85 /* test job control with empty signal queue */
88 /* now full fill signal queue in kernel */
89 sigemptyset(&sa.sa_mask);
90 sa.sa_flags = SA_SIGINFO;
91 sa.sa_sigaction = rtsig_handler;
92 sigaction(SIGRTMIN, &sa, NULL);
94 sigaddset(&set, SIGRTMIN);
95 sigprocmask(SIG_BLOCK, &set, NULL);
97 while (sigqueue(getpid(), SIGRTMIN, val))
100 /* signal queue is fully filled, test the job control again. */