一、信号的定义
Linux体系提供的让用户(历程)给其他历程发送异步信息的一种方式。在操作体系中,信号是一种历程间通讯的有限制的方式,主要用于提醒历程某个变乱已经发生。信号在Unix、类Unix以及其他POSIX兼容的操作体系中广泛应用。它作为一种异步的通知机制,当发送给一个历程时,操作体系会停止该历程正常的控制流程。操作体系要可以对信号进行如下的两个操作:
- 操作体系可以或许辨认一个信号并对该信号进行处理。
- 因为信号是异步产生的,所以操作体系要可以或许对到来的信号进行临时保存。
二、信号的分类
我们可以看到每一个信号对应一个信号和一个宏名称,以后我们给历程发送信号既可以接纳发送数字的形式也可以接纳发送宏名称的方式。 这里先熟悉一个信号,2号信号(SIGINT),用来退出终止历程,下面的例子会用到2号信号。
三、自定义信号的处理方式
如果我们不对收到的信号做自定义处理方式,那该信号就会按默认的方式进行处理。自定义信号的处理方式在我的明白中有两种,一种是让收到该信号的历程处理我交给它的使命,另外一种是忽略该收到的信号,下面我会对这两种方式进行简朴的演示。
3.1、收到该信号的历程处理我交给它的使命
捕获信号的函数为signal函数, 其中第一个参数就表现你要给历程发送第几号信号,第二个参数handler就是我们所写的函数,即我们要让历程在收到对应信号时所要实行的动作(替代默认动作),返回值为默认实办法作的函数指针,一样平常我们设定了新的实办法作就不需要默认实办法作了,所以返回值也可以不用接收。下面是让收到该信号的历程处理我交给它的使命的示例代码:
- #include <iostream>
- #include <unistd.h>
- #include <sys/types.h>
- #include <signal.h>
- void handler(int sig)
- {
- std::cout << "收到二号信号,但不退出!" << std::endl;
- }
- int main()
- {
- signal(SIGINT, handler);
- while (true)
- {
- std::cout << "I am a process! my pid is : " << getpid() << std::endl;
- sleep(1);
- }
- return 0;
- }
复制代码 当我不在命令行中发送kill -2指令时,我的这个历程会一直正常打印:
当我给这个历程发送一条二号指令时
该历程收到了2号信号,但已经不再实行原来的终止历程操作,转而实行我交给它的动作。
3.2、忽略收到的信号
忽略收到的信号只需要将signal函数的第二个参数改成SIG_IGN即可。
SIG_IGN在定义中其实就是将数字1强转成为sighandler_t指针
- #include <iostream>
- #include <unistd.h>
- #include <sys/types.h>
- #include <signal.h>
- int main()
- {
- signal(SIGINT, SIG_IGN);
- while (true)
- {
- std::cout << "I am a process! my pid is : " << getpid() << std::endl;
- sleep(1);
- }
- return 0;
- }
复制代码 上面这段代码无论再在命令行中输入kill -2指令都无法将历程终止,因为2号新号已经被忽略了。
历程照旧照常运行:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |