信号:通知进程产生了某个事件
9号杀死信号无法被修改,防止进程无法结束
信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作。
与信号有关的系统调用在“signal.h”头文件中有声明
常见信号的值,及对应的功能说明:
信号的值在系统源码中的定义如下:
#define SIGHUP 1
#define SIGINT 2 //键盘按下 Ctrl+c 时,会产生该信号
#define SIGQUIT 3
#define SIGILL 4
#define SIGTRAP 5
#define SIGABRT 6
#define SIGIOT 6
#define SIGBUS 7
#define SIGFPE 8
#define SIGKILL 9 //该信号的响应方式不允许改变
#define SIGUSR1 10
#define SIGSEGV 11
#define SIGUSR2 12
#define SIGPIPE 13 //读端关闭的描述符,写端写入时产生,该信号会终止程序
#define SIGALRM 14
#define SIGTERM 15 //系统 kill 命令默认发送的信号
#define SIGSTKFLT 16
#define SIGCHLD 17 //子进程结束后,会默认给父进程发送该信号
#define SIGCONT 18
#define SIGSTOP 19
#define SIGTSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
#define SIGURG 23
修改信号的响应方式 – signal()
第一个参数信号的名字
第二个调用信号的函数
有三种类型:
忽略1
默认0
自定义
相当于一个定义,不是每次都会执行,只有当键盘输入该信号时才会运行,这个定义也可以重新定义。
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<string.h>
void fun(int sig)
{
printf("sig=%d\n",sig);
signal(SIGINT,SIG_DFL);
}
int main()
{
signal(SIGINT,fun);
while(1)
{
printf("cao\n");
sleep(1);
}
}
发送信号 – kill() 系统命令kill本质是向进程发命令
kill() 可以向指定的进程发送指定的信号:
int kill(pid_t pid, int sig);
pid > 0 指定将信号发送个那个进程
pid == 0 信号被发送到和当前进程在同一个进程组的进程
pid == -1 将信号发送给系统上有权限发送的所有的进程
pid < -1 将信号发送给进程组 id 等于 pid 绝对值,并且有权限发送的所有的进程。
sig 指定发送信号的类型。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
// ./mykill 3445 2
int main(int argc,char *argv[])
{
if(argc!=3)
{
exit(0);
}
int pid=atoi(argv[1]);
int sig=atoi(argv[2]);
if(kill(pid,sig)==-1)
{
printf("killerror\n");
}
}