一、kill –l 显示所有信号,linux下有64个
1) SIGHUP 2) SIGINT(ctrl+c) 3) SIGQUIT(ctrl+\) 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL(可靠地杀死进程) 10) SIGUSR1
11) SIGSEGV(使用非法内存地址产生的信号——段错误) 12) SIGUSR2 13) SIGPIPE 14) SIGALRM(设定时间结束,杀死进程) 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT(使已经中断的信号继续执行) 19) SIGSTOP(可靠地暂停进程) 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
二、注册信号调用函数signal( )
#include <signal.h> typedef void (*sighandler_t)(int);//函数指针 sighandler_t signal(int signum, sighandler_t handler);//参数为一个int跟一个函数指针,返回上一次该信号的处理函数,错误返回为SIG_ERR;
sighandler_t还可以取其它值:
①SIG_IGN表示忽略sighandler_t
②SIG_DFL表示调用系统定义的默认处理
③sighandler_t表示捕捉相应信号(signum);
三、中断的系统调用
如若read系统调用已经接受并传送数据至应用程序缓冲区,但尚未接受到应用程序请求的全部数据,此时被中断,操作系统认为该系统调用失败,并将error设置为EINTR;为了帮助应用程序使其不必处理被中断的系统调用,4.2BSD映入了某些被中断系统调用的自动重启,包括ioctl、read、readv、write、writev、wait、waitpid。
四、可重入函数
主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。
也可以这样理解,重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。如果确实需要访问全局变量(包括static),一定要注意实施互斥手段。可重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。
五、发送信号
1、kill函数用于向某一给定进程或进程组发送信号
#include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig);
pid>0,向进程为pid值的进程发送信号
pid=0,向与发送信号的进程有相同进程组号的进程发送信号
pid<0,向进程组号为pid绝对值的进程组发送信号
pid=-1,未定义
2、raise函数用于向一个进程自身发送信号
#include <signal.h> int raise(int sig);
3、alarm函数用于设定时间片,是系统在一定时间后发送信号
#include <unistd.h> unsigned int alarm(unsigned int seconds);
seconds表示到下一次产生信号前间隔的时间
alarm() returns the number of seconds remaining
每个进程只能有一个alarm
4、pause函数让进程休眠直至有信号唤醒它
#include <unistd.h> int pause(void);
应用——写一个自己的sleep函数:
#include <stdio.h> #include <unistd.h> #include <signal.h> void alarm_hander(int s) { return ; } unsigned int mysleep(unsigned int seconds) { signal(SIGALRM, alarm_hander); alarm(seconds); pause();//进程休眠 return alarm(0);//alarm(0)信号唤醒进程,同时alarm返回上次 } int main(void) { printf("begin...\n"); unsigned int ret = mysleep(5); printf("after %d seconds\n",5-ret); return 0; } 输出结果: begin... (过了5秒输出下一条) after 5 seconds
除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。