个人网站的建设目标,手机 电脑 同步 wordpress,怎样提高网站浏览量,东莞百度网络推广1. 信号的概念
Linux进程间通信的方式之一。信号也称为“软件中断”。
信号特点#xff1a;
简单#xff1b;携带信息有限#xff1b;满足特定条件才发送信号#xff1b;可进行用户空间和内核空间进程的交互#xff1b;
信号4要素#xff1a;
#xff08;1#xf…1. 信号的概念
Linux进程间通信的方式之一。信号也称为“软件中断”。
信号特点
简单携带信息有限满足特定条件才发送信号可进行用户空间和内核空间进程的交互
信号4要素
1编号2名称3事件4默认处理方式。 2. 信号的编号
kill -l // 查看信号编号
POSIX信号标准 1~31为常规信号34~64为实时信号驱动编程、硬件相关。
为保证代码可移植性请使用信号名进行编程。 Linux常规信号介绍
编号信号事件默认处理1SIGHUP用户退出shell时由该shell启动的所有进程会收到SIGHUP信号。终止进程2SIGINTCtrl c 触发该信号由该终端启动的正在运行的进程会收到SIGINT信号。终止进程3SIGQUITCtrl \ 触发该信号由该终端启动的正在运行的进程会收到SIGQUIT信号。终止进程4SIGILLCPU检测到某些进程执行非法指令。终止进程并产生core文件5SIGTRAP由断点指令或其他trap指令产生。终止进程并产生core文件6SIGABRT调用abort函数时产生该信号。终止进程并产生core文件7SIGBUS非法访问内存地址、内存对齐出错。终止进程并产生core文件8SIGFPE发生致命运算错误。浮点运算错误、溢出、除数为0等。终止进程并产生core文件9SIGKILL无条件终止进程。该信号不能被忽略、处理、阻塞。终止任意进程10SIGUSE1用户定义的信号。程序员可在程序中定义并使用该信号。终止进程11SIGSEGV进程进行了无效内存访问段错误。终止进程并产生core文件12SIGUSR2用户定义的信号。程序员可在程序中定义并使用该信号。终止进程13SIGPIPEBroken pipe向一个无读端的管道写数据。终止进程14SIGALRM定时器超时超时时间由系统调用alarm设置。终止进程15SIGTERM终止进程该信号可被阻塞、终止。通常用来通知程序正常退出。kill命令的缺省选项就是这个信号。终止进程16SIGSTKFLTLinux早期版本的信号使用极少。终止进程17SIGCHLD子进程结束时父进程会收到该信号。忽略18SIGCONT使暂停的进程继续运行继续/忽略19SIGSTOP暂停进程。不能被忽略、处理、阻塞。暂停进程20SIGTSTPCtrl z 触发该信号暂停与终端交互的进程。暂停进程21SIGTTIN后台进程读终端控制台暂停进程22SIGTTOU类似于SIGTTIN后台进程向终端输出数据时触发暂停进程23SIGURGsocket上有紧急数据时向当前进程发出该信号忽略24SIGXCPU进程执行时间超过CPU时间的总量。不是超过了时间片终止进程25SIGXFSZ超过文件最大长度终止进程26SIGVTALRM虚拟时钟产生的信号类似于SIGALRM。该信号3计算该进程占用CPU的时间终止进程27SIGPROF类似于SIGVTALRM计算进程占用CPU时间 系统调用时间终止进程28SIGWINCH窗口大小变化时触发忽略29SIGIO向进程发出一个异步IO事件忽略30SIGPWR关机终止进程31SIGSYS无效的系统调用终止进程并产生core文件31~64SIGRTMIN~SIGRTMAXLinux实时信号无固定含义可由用户自定义终止进程 3. 信号的状态
1产生状态 a用户发出信号 Ctrl c SIGINT Ctrl \ SIGQUIT Ctrl z SIGSTOP b硬件异常 除数为0、无效内存访问、溢出等被硬件检测到通知内核内核将对应的信号发给相应进程。 c软件异常 检测到某种软件信号如定时器alarm则通知相关进程。 d系统调用 如kill、raise、abort等系统调用会发出信号。 注意接收信号进程与发送信号进程的所有者必须相同或发送信号进程的所有者是root用户。 ekill、killall等会发送信号。
2未决状态信号未被处理。
3递达状态信号被处理了。 4. 阻塞信号集 未决信号集
每个进程的PCB中有两个信号集合阻塞信号集 未决信号集。
两个集合都是用位图表示信号的状态1表示阻塞或未决。
仅可设置阻塞信号集未决信号集由内核自动设置。
1阻塞信号集 将某信号加入该阻塞信号集该信号将被阻塞 若被阻塞期间收到该信号则不会被处理 但在解除阻塞后阻塞期间收到的那次信号仍然会被处理相当于滞后处理该信号。
2未决信号集 某信号产生未决信号集中描述该信号的状态位被置为1表示该信号为未决状态当信号被处理该信号对应的状态位被置为0。 信号产生后由于某些原因主要为被阻塞不能抵达这些信号状态为未决状态。 信号被阻塞期间一直处于未决状态。 5. 信号集函数
1信号集操作函数
#includesignal.hint sigemptyset(sigset_t* set); // 将set信号集置空
int sigfillset(sigset_t* set); // 将所有信号加入set信号集
int sigaddset(sigset_t* set, int signo); // 将signo信号加入set信号集
int sigdelset(sigset_t* set, int signo); // 将signo信号从set信号集移除
int sigismember(const sigset_t* set, int signo); // 判断set信号集中是否存在signo信号/*sigset_t为二进制位图*/
信号集操作函数使用示例
#includestdio.h
#includestdlib.h
#includestring.h
#includesignal.h
#includeunistd.hvoid showSet(sigset_t* set) { // 显示信号集for (int i 1; i 32; i) {if (sigismember(set, i)) {printf(1);} else {printf(0);}}putchar(\n);
}int main(int argc, const char* argv[]) {int i 0;// 定义信号集sigset_t set;// 清空信号集sigemptyset(set);puts(sigemptyset后的信号集);showSet(set);// 将所有的信号加入信号集sigfillset(set);puts(sigfillset后的信号集);showSet(set);// 将信号1,3从信号集中移除sigdelset(set, SIGHUP);sigdelset(set, SIGQUIT);puts(sigdelset后的信号集);showSet(set);// 将信号1,3加入信号集sigaddset(set, SIGHUP);sigaddset(set, SIGQUIT);puts(sigaddset后的信号集);showSet(set);return 0;
}
运行结果 2sigprocmask函数
#includesignal.hint sigprocmask(int how, const sigset_t* set, sigset_t* oldset);
/*
功能根据how指定的方法对进程的阻塞信号集进行操作。新的阻塞信号集由set指定原先的阻塞信号集由oldset保存。参数how对阻塞信号集的操作方式SIG_BLOCK向阻塞信号集中添加set信号集新的信号集是set与oldset的并集。相当于mask mask | set;SIG_UNBLOCK从阻塞信号集中删除set集合。相当于mask mask ~set;SIG_SETMASK将阻塞信号集设置为set。相当于mask set;set要操作的信号集地址。若为NULL则不改变阻塞信号集。仅将当前的阻塞信号集保存到oldset中。oldset保存原先阻塞信号集的地址。返回值成功0失败-1失败时错误码只可能是EINVAL表示参数how不合法。
*/
sigprocmask示例
屏蔽SIGINTCtrl C信号。
#includestdio.h
#includestdlib.h
#includestring.h
#includesignal.h
#includeunistd.hvoid func0(int signum) {printf(捕捉到信号%d\n, signum);
}void func1(int signum) {printf(捕捉到信号%d\n, signum);
}int main(int argc, const char* argv[]) {int ret -1;// 信号集sigset_t set;sigset_t old;/*注册信号处理函数。*/// SIGINT: Ctrl c 2号信号signal(SIGINT, func0);/*SIGQUIT: Ctrl \*/signal(SIGQUIT, func1);/*将SIGINT加入阻塞信号集*/printf(按回车键阻塞信号2 SIGINT.\n);// 只能输入回车输入一个字符再回车就相当于输入两个字符第二个回车被下面的getchar接收。getchar();sigemptyset(set); // 清空信号集sigaddset(set, SIGINT); // 将2号信号加入信号集sigemptyset(old); // 清空信号集ret sigprocmask(SIG_BLOCK, set, old); // 设置阻塞信号集if (-1 ret) {perror(sigprocmask);return 1;}printf(2号信号SIGINT屏蔽成功.\n);printf(按下回车键解除2号信号的屏蔽.\n);getchar();/*将阻塞信号集设置为原先的集合*/ret sigprocmask(SIG_SETMASK, old, NULL);if (-1 ret) {perror(sigprocmask);return 1;}getchar();return 0;
}
运行结果 3sigpending函数
获取未决信号集
#includesignal.hint sigpending(sigset_t* set);
/*
功能获取未决信号集存入set集合
参数set存储未决信号集
返回值成功0失败-1
*/
sigpending示例
#includestdio.h
#includestdlib.h
#includestring.h
#includesignal.h
#includeunistd.hint main(int argc, const char* argv[]) {int ret -1;sigset_t new;sigset_t old;sigset_t set;sigemptyset(new); // 清空信号集setsigemptyset(old); // 清空信号集setsigemptyset(set); // 清空信号集set/*将信号2、3放入信号集*/sigaddset(new, SIGINT);sigaddset(new, SIGQUIT);ret sigprocmask(SIG_BLOCK, new, old); // 将信号2、3放入阻塞信号集if (-1 ret) {perror(sigprocmask);return 1;}getchar();ret sigpending(set); // 获取阻塞信号集if (-1 ret) {perror(sigpending);return 1;}for (int i 1;i 32;i) { // 打印阻塞信号集if (sigismember(set, i)) {printf(%d , i);}}putchar(\n);return 0;
}
将信号2、信号3加入阻塞信号集后按Ctrl c、Ctrl \ 被阻塞之后解除阻塞会捕捉到信号2、信号3.
运行结果