- Signals Overview
- signal table
- signals sent
- signals received
- catching, masking, blocking
- Unreliable signals
- Interrupting System Calls
- Slow system Calls
- Reentrant functions
- do not use heap or global data, everything on the stack
- cannot use stdio
- SIGCLD vs SIGCHLD
- New Improved Signals (POSIX signals)
- sigactions replacing functions in table
- int sigaction(int sig, const struct sigaction *act, struct
sigaction *oact);
- man signal
- man 2 sigaction
- Review Signal Terminology
- generated
- delivered
- received
- blocked
- pending
- Signal sets
- int sigemptyset(sigset_t *set)
- int sigfillset(sigset_t *set)
- int sigaddset(sigset_t *set)
- int sigdelset(sigset_t *set)
- int sigismember(sigset_t *set)
- Possible macro definitions
#define sigemptyset(ptr) (*(ptr) = 0)
#define sigfillset(ptr) (*(ptr) = ~(sigset_t)0, 0)
/* Note comma operator above */
- int sigpending(sigset_t *set)
- sigaction(int sig, struct sigaction *act, struct sigaction *oldact)
- sigsetjmp and siglongjmp save and restore sigmask
- sigsetjmp and siglongjmp
- int str2sig(const char *str, int *signum); sig2str
- int sigsend(idtype_t idtype, id_t id, int sig);
- int sigprocmask(int cmd, const sigset_t *set, sigset_t *oset)
SIG_SETMASK
SIG_BLOCK
SIG_UNBLOCK
- Example: sigmask0.c
#include
#include
main() {
sigset_t sigset, oldset;
sigemptyset(&sigset);
sigaddset(&sigset, SIGINT);
if(sigprocmask(SIG_SETMASK, &sigset, &oldset) < 0) {
fprintf(stderr, "sigprocmask ERROR\n");
exit(1);
}
if(sigismember(&sigset, SIGINT)) printf("SIGINT MASKED\n");
else printf("SIGINT NOT MASKED\n");
}
- sigmask1.c
#include
#include
main() {
sigset_t sigset, oldset, newset;
int pid;
sigemptyset(&sigset);
sigaddset(&sigset, SIGINT);
if(sigprocmask(SIG_SETMASK, &sigset, &oldset) < 0) fatal("sigprocmask");
if((pid = fork()) < 0) fatal("Fork failed");
else if (pid == 0) {
sleep(3);
if(sigpending(&newset)< 0) fatal("SIGpending");
if(sigismember(&newset,SIGINT))
printf("SIGINT signal is pending\n");
}else{
if(kill(pid, SIGINT)< 0) fatal("Fork failed"); /* sigsend on SUNs */
}
}
fatal(char *s) {
fprintf(stderr,"ERROR %s\n", s);
exit(1);
}