In the following code, I try to send SIGINT, SIGHUP, SIGQUIT signal to child process.
void sighup(int sig); void sigint(int sig); void sigquit(int sig); These are my signal handler.
the issue is signal handler never invoked.
#include<stdio.h> #include<signal.h> #include<stdlib.h> #include<unistd.h> void sighup(int sig); void sigint(int sig); void sigquit(int sig); int main() { int pid, i, j, k; if ((pid = fork()) < 0) { perror("fork"); exit(1); } if(pid == 0) { signal(SIGHUP, sighup); signal(SIGINT, sigint); signal(SIGQUIT, sigquit); } else { j = 0; for (i = 1; i <= 5; i++) { j++; if (i % 2 == 0) { printf("PARENT: sending SIGHUP Signal : %d\n", j); kill(pid, SIGHUP); sleep(3); } else { printf("PARENT: sending SIGINT signal : %d\n", j); kill(pid, SIGINT); sleep(3); } } printf("Parent sending SIGQUIT\n"); kill(pid, SIGQUIT); } } void sighup(int sig) { signal(SIGHUP, sighup); printf("Child: I have received sighup\n"); } void sigint(int sig) { signal(SIGINT, sigint); printf("Child: I have received sighINT\n"); } void sigquit(int sig) { printf("My daddy has killed me\n"); exit(0); } Below lines never printed on screen
Child: I have received sighup Child: I have received sighINT My daddy has killed me
Output
PARENT: sending SIGINT signal : 1 PARENT: sending SIGHUP Signal : 2 PARENT: sending SIGINT signal : 3 PARENT: sending SIGHUP Signal : 4 PARENT: sending SIGINT signal : 5 Parent sending SIGQUIT
printf()in signal handlers? It explains that usingprintf()in a signal handler is no allowed by the C standard (which has incredibly rigid rules about what can appear in a signal handler) or POSIX (which has much more relaxed rules, but still doesn't allow you to useprintf()).iandjseems a little odd; they are carefully kept with the same value.