目录
4、kill()发送信号到进程响应有三种方式:默认、忽略、自定义(signal())
1、信号的基本概念
信号是系统相应某个条件而产生的事件,进程接收信号会执行相应的操作
与信号有关的系统调用再signal.h头文件中有声明
2、修改信号的相应方式-signal()
在键盘上按ctrl+c,会给当前终端前台执行的进程发送SIGINT信号,用signal()修改SIGINT信号的相应方式的代码如下:
void fun(int sign)
{
printf(“fun was called,sign=%d\n”,sign);
}
int main()
{
signal(SIGNT,fun);
while(1)
{
sleep(1);
printf(“main running\n”);
}
exit(0);
}
3、发送信号 kill()
kill()可以向指定的进程发送指定的信号:
int kill(pid_t pid,int sig)
pid>0 指定将信号发送到那个进程
pid==0 信号被发送到和当前进程在同一个进程组的进程
pid==--1 将信号发送给系统上所有有权限发送的进程
pid<-1 将信号发送给进程组id等于pid的绝对值,并且有权限发送的所有进程
sig 指定发送信号的类型
int main(int argc,char*argv[])
{
if(argc!=3)
{
printf(“argc error”);
exit(0);
}
int pid=0;
int sig=0;
sccanf(argv[1],”%d”,&pid);
sccanf(argv[2],”%d”,&sig);
if(kill(pid,sig)==-1)
{
perror(“kill error”);
}
exit(0);
}
4、kill()发送信号到进程响应有三种方式:默认、忽略、自定义(signal())
5、信号什么时候会产生
ctrul+c(命令)——>发送信号//用信号代表这件事情产生了
中断(软中断)//信号打断了进程
当某个进程正在执行时,用户在终端键盘上按下某些键时,此时会产生一个硬件中断。此时终端驱动程序会将其解释为某一种信号,操作系统得知后会将该信号发送个正在前台运行的进程。并在合适的时机去处理该信号
大部分信号的产生都是因为进程产生了异常
只有信号才能把进程终止
- 信号自定义signal(),将信号改变成自定义的信号,当调用signal时,内核收到信号,直接调用相应的方法
6、signal(信号名,新定义的函数名)
- 忽略SIG_IGN
- 默认SIG_DFL//收到以后当作没收到
- kill()//发送信号,pid 信号的代号,向指定的进程发送信号
九号信号永远不会被改变,是留给管理员的最后一个办法,这个信号不可以通过signal进行改变
argv[]//参数前三位分别是路径、pid(唯一标识进程的编码)、sig(信号的代号)
7、信号的实现
收到信号的实体是一个进程
- 信号是为了通知进程发生了某种事件,事件没有正常结束,一定是发出了某种信号,事件中发生了某种事件
- 段错误:与内存有关的错误