赞
踩
信号是由于进程产生,但是由内核调度传递给另一个进程:
Ctr+c --> 2)SIGINT(终止/中断)
Ctr+z --> 20)SIGTSTOP(终端暂停)
Ctr+\ --> 3)SIGQUIT(退出)
kill(2), raise, abort
alarm
11)SIGSEV(段错误)
8)SIGFPE
kill(1)
默认:但是每个信号的默认动作可能不一致
9)SIGKILL、19)SIGSTOP
不允许忽略和捕捉,只能执行默认动作。忽略:对于该信号的处理动作就是忽略
捕捉:调用用户处理函数
1.kill
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
2.raise/abort
// raise
#include <signal.h>
int raise(int sig);
// abort
#include <stdlib.h>
void abort(void);
3.alarm
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
14)SIGALRM
信号,进程收到该信号,默认动作是终止进程。seconds == 0
时,即取消定时器4.setitimer
#include <sys/time.h>
int getitimer(int which, struct itimerval *curr_value);
int setitimer(int which, const struct itimerval *new_value,
struct itimerval *old_value);
struct itimerval {
struct timeval it_interval; /* Interval for periodic timer */
struct timeval it_value; /* Time until next expiration */
};
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
setitimer
相比较 alarm
提供了更加精确的定时信号控制,前者是微妙级,后者是秒级。
ITIMER_REAL
: 等同于 alarm
,自然定时,即和进行状态无关,时间到就发送SIGALRM
ITIMER_VIRTUAL
: 计算进程占用cpu时间,发送信号SIGVTALRM
ITIMER_PROF
: 计算进程cpu调用及执行系统调用时间,发送信号SIGPROF
new_value/old_value
setitimer
是一个周期定时,new_value
设置的本次和下次定时时间。当下次定时时间为0,就仅仅定时一次。5. singal
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
通过signal
函数可以自定义信号处理函数来应对信号。信号是由内核检测到,而函数signal
是将信号和信号处理函数联系起来。
signal
是接受到的信号,传递给信号处理函数。typedef void (*sighandler_t)(int);
即返回类型是void
,参数是int
类型的函数,同时这个函数的接受值就是产生的信号。6. 信号集
内核通过读取未决信号集来判断信号是否应该被处理。信号屏蔽字mask可以影响未决信号集,而信号屏蔽字需要通过数据类型sigset_t
创建的对象set
来设置mask
,来达到屏蔽信号的目的,即影响未决信号集来决定信号是否将被处理。他们之间的关系如图:
#include <signal.h>
int sigemptyset(sigset_t *set); // 将信号集合清空
int sigfillset(sigset_t *set); // 将信号集全部置1
int sigaddset(sigset_t *set, int signum); // 将某个信号加入信号集
int sigdelset(sigset_t *set, int signum); // 将某个信号清出信号集
int sigismember(const sigset_t *set, int signum); // 判断某个信号是否在信号集
#define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int))) // 32
typedef struct {
unsigned long int __val[_SIGSET_NWORDS];
} __sigset_t;
typedef __sigset_t sigset_t;
sigset_t
是一个位图,通过上述函数来操作这个位图。上面的函数成功返回0,失败返回-1。sigprocmask
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
SIG_BLOCK
: 进程的屏蔽信号集是这个set
和原来的屏蔽信号笔的并(union)。SIG_UNBLOCK
: 将set
中的信号从当前信号集合中移除出去。SIG_SETMASK
: 直接将set
覆盖当前信号集set
即上面的sigset_t
格式,是本次函数给阻塞信号的设定值。sigpending
#include <signal.h>
int sigpending(sigset_t *set);
set
中传出。7. sigaction
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *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);
};
struct sigaction
sa_handler
: 用来指定捕捉到信号时候的行为。SIG_DFL
、SIG_IGN
、信号处理函数。sa_sigaction
:sa_flags = SA_SIGINFO
时,sa_sigaction
指定信号处理函数(之前是sa_handler
指定)。sa_mask
:指定的是在处理信号的过程中需要屏蔽的信号,即不捕捉该该信号,那么就会执行默认动作。而且触发该处理函数的信号再来时候会丢弃,即 多次信号只执行一次 ,除非sa_flags = SA_NODEFER
。sa_flags
:指定的是用于修改信号行为的标志位,默认是0,即在信号处理函数执行期间自动屏蔽本信号。这个函数的操作还是要依赖 mask的操作函数。sa_restorer
:不要使用。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。