信号的基本概念
信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作。
与信号有关的系统调用在“signal.h”头文件中有声明 常见信号的值,及对应的功能说明:
修改信号的响应方式 – signal()
我们来做个小实验:
在键盘上按下 Ctrl+c 时,会给当前终端前台执行的进程发送 SIGINT 信号,用 signal 修
改 SIGINT 信号的响应方式示例代码如下:
代码注释如下:
1. #include<stdio.h> // 包含输入输出的头文件
2. #include<stdlib.h> // 包含一些常用函数的头文件
3. #include<unistd.h> // 包含一些系统调用的头文件
4. #include<string.h> // 包含字符串操作的头文件
5. #include<assert.h> // 包含断言的头文件
6. #include <signal.h> // 包含信号相关的头文件
8. void fun(int sign) // 定义一个名为fun的函数,参数为sign
9. {
10. printf("fun was called, sign = %d\n", sign); // 输出一段信息,包含参数sign的值
11. }
13. int main() // 主函数
14. {
15. signal(SIGINT, fun); // 注册信号SIGINT,并在接收到信号时调用函数fun
16. while(1) // 无限循环
17. {
18. sleep(1); // 程序休眠1秒钟
19. printf("main running\n"); // 输出一段信息
20. }
21.
22. exit(0); // 退出程序
23. }
发送信号 – kill()
kill() 可以向指定的进程发送指定的信号:
int kill(pid_t pid, int sig);
pid > 0 指定将信号发送个那个进程
pid == 0 信号被发送到和当前进程在同一个进程组的进程
pid == -1 将信号发送给系统上有权限发送的所有的进程
pid < -1 将信号发送给进程组 id 等于 pid 绝对值,并且有权限发送的所有的进程。
sig 指定发送信号的类型。
使用 kill()系统调用实现类似于系统 kill 命令的程序如下:
#include <stdio.h> //标准输入输出头文件
#include <stdlib.h> //标准库头文件,包含一些基本函数,如exit()
#include <unistd.h> //Unix标准头文件,包含一些基本系统函数,如kill()
#include <string.h> //字符串处理头文件
#include <assert.h> //断言处理头文件
#include <signal.h> //信号处理头文件
int main(int argc, char* argv[])//pid, sig
{
if ( argc != 3 )//判断参数数量是否正确
{
printf("argc error\n");//打印错误信息
exit(0);//退出程序
}
int pid = 0;//定义pid变量
int sig = 0;//定义sig变量
sscanf(argv,"%d",&pid);//将第一个参数转换成整型并赋值给pid
sscanf(argv,"%d",&sig);//将第二个参数转换成整型并赋值给sig
if ( kill(pid,sig) == -1 )//向pid进程发送sig信号
{
perror("kill error");//打印错误信息
}
exit(0);//退出程序
}