信号是软件中断,感觉就像javascript里的事件
$ a.out & 在后台启动进程
[1] 4720 作业控制s h e l l打印作业号和进程I D
$ kill -USR1 4720 向该进程发送 SIGUSR1
received SIGUSR1
$ kill -USR2 4720 向该进程发送 SIGUSR2
received SIGUSR2
$ kill 4720 向该进程发送S I G T E R M
[1] + Terminated a.out &
★可再入函数:
进程捕捉到信号并继续执行时,它首先执行该信号处理程序中的指令。如果从信号处理程
序返回(例如没有调用e x i t或l o n g j m p),则继续执行在捕捉到信号时进程正在执行的正常指令序列(这类似于硬件中断发生时所做的),但在信号处理程序中,不能判断捕捉到信号时进程执行到何处,所以异步信号安全的函数只有这些:
apue10.6,unpv22的mq_notify函数,p71,
[img]http://dl.iteye.com/upload/attachment/348512/441b63cd-0e75-34e4-9677-d7098142207f.jpg[/img]
★kill和raise函数
★使用alarm函数可以设置一个时间值(闹钟时间),在将来的某个时刻该时间值会被超过。当
所设置的时间值被超过后,产生S I G A L R M信号。如果不忽略或不捕捉此信号,则其默认动作是终止该进程。
pause函数使调用进程挂起直至捕捉到一个信号
★处理信号集:
#include <signal.h>
int sigemptyset(sigset_t *set) ;
int sigfillset(sigset_t *set) ;
int sigaddset(sigset_t *set, int signo) ;
int sigdelset(sigset_t *set, int signo) ;
四个函数返回:若成功则为0,若出错则为-1
int sigismember(const sigset_t *set,int *signo) ;
返回:若真则为1,若假则为0
★sigprocmask函数
一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。调用
函数sigrocmask可以检测或更改(或两者)进程的信号屏蔽字。
★sigpending返回对于调用进程被阻塞不能递送和当前未决的信号集。该信号集通过set参数返回。
#include <signal.h>
int sigpending(sigset_t *set);
★sigaction函数的功能是检查或修改(或两者)与指定信号相关联的处理动作。此函数取代了
UNIX早期版本使用的signal函数
★sigsetjmp和siglongjmp函数,在信号处理程序中经常调用longjmp函数以返回到程序的主循环中,而不是从该处理程序返回
★sigsuspend在一个原子操作中实现恢复信号屏蔽字,然后使进程睡眠,这种功
能是由sigsuspend函数所提供的
★abort函数的功能是使程序异常终止
★system:POSIX.2要求system忽略SIGINT和SIGQUIT,阻塞SIGCHLD
★sleep:
此函数使调用进程被挂起直到:
(1) 已经过了s e c o n d s所指定的墙上时钟时间,或者
(2) 该进程捕捉到一个信号并从信号处理程序返回。
#include "apue.h"
static void sig_usr(int); /* one handler for both signals */
int
main(void)
{
if (signal(SIGUSR1, sig_usr) == SIG_ERR)
err_sys("can't catch SIGUSR1");
if (signal(SIGUSR2, sig_usr) == SIG_ERR)
err_sys("can't catch SIGUSR2");
for ( ; ; )
pause();
}
static void
sig_usr(int signo) /* argument is signal number */
{
if (signo == SIGUSR1)
printf("received SIGUSR1\n");
else if (signo == SIGUSR2)
printf("received SIGUSR2\n");
else
err_dump("received signal %d\n", signo);
}
$ a.out & 在后台启动进程
[1] 4720 作业控制s h e l l打印作业号和进程I D
$ kill -USR1 4720 向该进程发送 SIGUSR1
received SIGUSR1
$ kill -USR2 4720 向该进程发送 SIGUSR2
received SIGUSR2
$ kill 4720 向该进程发送S I G T E R M
[1] + Terminated a.out &
★可再入函数:
进程捕捉到信号并继续执行时,它首先执行该信号处理程序中的指令。如果从信号处理程
序返回(例如没有调用e x i t或l o n g j m p),则继续执行在捕捉到信号时进程正在执行的正常指令序列(这类似于硬件中断发生时所做的),但在信号处理程序中,不能判断捕捉到信号时进程执行到何处,所以异步信号安全的函数只有这些:
apue10.6,unpv22的mq_notify函数,p71,
[img]http://dl.iteye.com/upload/attachment/348512/441b63cd-0e75-34e4-9677-d7098142207f.jpg[/img]
★kill和raise函数
★使用alarm函数可以设置一个时间值(闹钟时间),在将来的某个时刻该时间值会被超过。当
所设置的时间值被超过后,产生S I G A L R M信号。如果不忽略或不捕捉此信号,则其默认动作是终止该进程。
pause函数使调用进程挂起直至捕捉到一个信号
★处理信号集:
#include <signal.h>
int sigemptyset(sigset_t *set) ;
int sigfillset(sigset_t *set) ;
int sigaddset(sigset_t *set, int signo) ;
int sigdelset(sigset_t *set, int signo) ;
四个函数返回:若成功则为0,若出错则为-1
int sigismember(const sigset_t *set,int *signo) ;
返回:若真则为1,若假则为0
★sigprocmask函数
一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。调用
函数sigrocmask可以检测或更改(或两者)进程的信号屏蔽字。
★sigpending返回对于调用进程被阻塞不能递送和当前未决的信号集。该信号集通过set参数返回。
#include <signal.h>
int sigpending(sigset_t *set);
★sigaction函数的功能是检查或修改(或两者)与指定信号相关联的处理动作。此函数取代了
UNIX早期版本使用的signal函数
★sigsetjmp和siglongjmp函数,在信号处理程序中经常调用longjmp函数以返回到程序的主循环中,而不是从该处理程序返回
★sigsuspend在一个原子操作中实现恢复信号屏蔽字,然后使进程睡眠,这种功
能是由sigsuspend函数所提供的
★abort函数的功能是使程序异常终止
★system:POSIX.2要求system忽略SIGINT和SIGQUIT,阻塞SIGCHLD
★sleep:
此函数使调用进程被挂起直到:
(1) 已经过了s e c o n d s所指定的墙上时钟时间,或者
(2) 该进程捕捉到一个信号并从信号处理程序返回。