公司做的网站打开慢,企业宣传ppt的方案模板,做结婚视频储存网站,盛泽做网站目录
什么是信号#xff1f;
如何使用信号#xff1f;
代码#xff1a;
testSig.cc
makefile#xff1a;
验证#xff1a;
2号信号#xff1a;
9号信号#xff1a;
建立对信号的认识#xff1a;
信号的处理
自定义信号的处理方式#xff1a;
signal 函数…目录
什么是信号
如何使用信号
代码
testSig.cc
makefile
验证
2号信号
9号信号
建立对信号的认识
信号的处理
自定义信号的处理方式
signal 函数
参数
返回值
代码1以2号信号为例
验证1
代码2
验证2 编辑
忽略信号
代码
验证 什么是信号 信号是 Linux 系统提供的、让用户进程给其他进程发送异步信号的一种方式用于通知进程发生了某个事件。 异步一种编程模型或操作模式在这种模式下任务的执行不会阻塞或等待其他任务完成而是独立进行并且可以在任务完成时通过回调、事件或其他机制通知主程序。 指令 kill -l 可以查看 Linux 中的信号可以注意到没有 0号、32号、33号信号且从 34号信号开始信号名字中都带有 RT 如何使用信号
下面用简单的代码来认识一些常见的信号
代码
testSig.cc
#includeiostream
using namespace std;
#includeunistd.h
#includesys/types.h
int main()
{while(1){cout I am activing ... pid: getpid()endl;sleep(1);}return 0;
}
makefile
testSig:handlerSig.ccg -o $ $^ -stdc11.PHONY:clean
clean:rm -f testSig 验证 指令 kill -signal pid 就可以向指定进程发送信号。 2号信号 2号信号在Linux系统中对应的是 SIGINTInterrupt Signal通常被称为中断信号用于请求中断正在运行的程序。 可以看出死循环的进程在收到信号后结束死循环进程终止 指令必须带 pid不能是进程名 指令中的 -signal 可以是数字也可以是信号的名字即宏定义 9号信号 9号信号在Linux系统中对应的是 SIGKILL 信号是一个强制终止信号用于立即终止进程。 进程收到信号后会打印 Killed 建立对信号的认识
初步了解了什么是信号后我们需要建立以下对信号的认识 1、还没有向指定进程发送信号时进程已经知道收到信号时该怎么处理了 2、信号能够被识别出来也就是说编写内核的才程序员提前给进程设定好了识别特定信号的方式 3、进程收到信号时如果进程正在处理更重要的事情进程可以暂时不处理收到的信号但是进程必须临时保存该信号 4、进程收到信号时可以不立即处理可以在合适的时候处理 5、信号可以随时产生我们无法预测信号什么时候发送所以信号是异步发送的 以上的认识可以结合日常生活的例子理解比如把早起的闹钟设为一种信号我们在闹钟响之前已经知道听到闹钟时该怎么处理这个信号了那就是起床我们也可以先不起床等到想起床的时候再起床而且我们在睡梦中无法预测闹钟什么时候会响。
信号的处理 从上面两个信号的例子可以看出进程收到不同的信号后有不同的处理方式而以上的信号处理方式是信号处理的默认动作我们还可以捕捉信号自定义信号的处理方式或者忽略信号 自定义信号的处理方式
signal 函数 signal 函数是 Linux 系统中用于设置信号处理函数的简单接口。它允许你指定当进程接收到某个信号时应调用哪个函数而不是默认的信号处理方式。 #include signal.hvoid (*signal(int signum, void (*handler)(int)))(int);
参数 signum: 要处理的信号编号。 handler: 信号处理函数的指针类型为 void (*)(int)。这个函数会在接收到指定信号时被调用也就是说如果进程没有收到指定信号handler 函数将永远不会被调用 返回值 成功: 返回之前的信号处理函数指针。 失败: 返回 SIG_ERR此时 errno 会被设置为相应的错误码。 代码1以2号信号为例
#includeiostream
using namespace std;
#includeunistd.h
#includesys/types.h
#includesignal.hvoid handler(int signo)
{cout I got a signal,signo:signoendl;
}
int main()
{signal(SIGINT,handler);while(1){cout I am activing ... pid: getpid()endl;sleep(1);}return 0;
}
验证1 代码2
在代码1的基础上设置了退出码
#includeiostream
using namespace std;
#includeunistd.h
#includesys/types.h
#includesignal.hvoid handler(int signo)
{cout I got a signal,signo:signoendl;exit(100);
}
int main()
{signal(SIGINT,handler);while(1){cout I am activing ... pid: getpid()endl;sleep(1);}return 0;
}
验证2
进程结束后当我们查看退出码时退出码为100 忽略信号 只需要在 signal 的 handler 参数传入 SIG_IGN即可忽略指定的信号 代码
#includeiostream
using namespace std;
#includeunistd.h
#includesys/types.h
#includesignal.hint main()
{signal(SIGINT,SIG_IGN);while(1){cout I am activing ... pid: getpid()endl;sleep(1);}return 0;
}
验证 可以看出当我们向进程发送 2号信号时进程忽略了 2号信号不做任何处理于是发送 9号信号终止进程