(原) 信号(中)------信号的API函数
(1)signal函数
void (*signal(int signo, void (*handler)(int)))(int)
参数:signo---信号编号
handler---SIG_IGN忽略该信号,SIG_DFL采用系统默认方式处理信号,自定义的信号处理函数指针。
(2)sigaction函数
int sigaction(int signO, const struct sigaction *act, struct sigaction *oldact)
参数:signo---信号编号
act------要设置的对信号的新处理方式
oldact---原来对信号的处理方式
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
}
(3)kill函数
int kill(pid_t pid, int signo)
参数:
pid---pid大于零时,pid是信号欲送往的进程的标识
---pid等于零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程
---pid等于-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)
---pid小于-1时,信号将送往以-pid为组标识的进程
signo---信号编号
注意:int raise(signo)等价于int kill(getpid(), int signo)
(4)alarm和pause函数
unsigned int alarm(unsigned int seconds); //返回0或者以前设置的闹钟时间的余留秒数
int pause(void);
注意:(1)使用alarm函数设置计时器,在将来某个指定时间该计时器会超时,产生SIGALRM信号,默认动作时终止调用alarm函数的进程,
每个进程只能有一个闹钟时钟,如果在调用alarm之前已设置过闹钟时间,则任何以前的闹钟时间都被新值所代替。当在调用
alarm()前已经设置了一个闹钟,那么我们可以调用alarm(0)来取消此闹钟,并返回剩余时间。
(2)puase函数使调用进程挂起直到捕捉到一个信号。只有执行了一个信号处理程序并从其返回时,pause才返回-1,并将errno设置
为EINTR。
写个程序练习以上函数,程序如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <sys/wait.h> 4 #include <unistd.h> 5 #include <sys/types.h> 6 #include <errno.h> 7 #include <signal.h> 8 static void sig_kill(int signo) 9 { 10 printf("Received from kill().\n"); 11 } 12 static void sig_alarm(int signo) 13 { 14 printf("Receiver form aralm().\n"); 15 } 16 int main() 17 { 18 19 signal(SIGHUP,sig_kill); 20 signal(SIGALRM,sig_alarm); 21 22 printf("kill() is called.\n"); 23 kill(getpid(),SIGHUP); 24 printf("alarm() is called.\n"); 25 alarm(3); 26 printf("pause() is called.\n"); 27 pause(); 28 printf("raise() is called.\n"); 29 raise(SIGHUP); 30 exit(0); 31 }
执行结果:


浙公网安备 33010602011771号