Linux 发送信号

时间:2021-03-16 05:46:58
使用kill命令
--在命令行执行kill命令。向指定进程发送信号。
使用kill函数
int kill(pid_t pid,int sig);
--参数pid指定一个要杀死的进程,而sig是要发送的信号。
//kill函数发送信号
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h> #include <sys/types.h>
#include <signal.h> int main(int arg, char *args[])
{
if(arg<)
{
printf("请输入一个参数!\n");
return -;
}
pid_t pid=atoi(args[]);
int resint=;
resint=kill(pid,SIGKILL);
printf("返回值是%d\n",resint);//打印0
return ;
}
使用raise函数
int raise(int signum);
kill函数将信号发送给进程,raise函数允许进程向自身发送信号
raise(signum)相当于kill(getpid(),signum);
alarm函数设置了一个定时器,当定时器到了给当前进程发送SIGALRM信号。
unsigned int alarm(unsigned int seconds);
seconds是计时器时间到后时钟的秒数。
如果没有设置其他超时,函数返回0,否则返回值为前面安排超时中保留的秒数。
一个进程只能设置一次超时
把seconds设置为0可以取消前面的超时设置。
//捕捉信号
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h> void catch_signal(int sign)
{
switch(sign)
{
case SIGINT:
//SIGINT默认行为是退出进程
printf("SIGINT signal\n");
exit();
break;
case SIGALRM:
//SIGALRM默认行为是退出进程
printf("SIGALRM signal\n");
alarm();
break;
case SIGKILL:
printf("SIGKILL signal\n");
break;
}
} int main(int arg, char *args[])
{
signal(SIGINT,catch_signal);
signal(SIGALRM,catch_signal);
signal(SIGKILL,catch_signal);
int i=;
//永远循环的alarm信号
alarm();
while()
{
printf("hello god %d\n",i++);
sleep();
}
return ;
}
abort函数
void abort(void);
该函数发送SIGABRT信号给调用进程,进程不应该忽略这个信号。
即使进程捕捉到SIGABRT这个信号,进程还是会异常退出
让进程捕捉SIGABRT的意图是在进程终止前由其执行所需的清理操作。
sleep函数
unsigned int sleep(unsigned int seconds);
参数seconds指定了睡眠时间。
超过seconds制定时间,函数返回。
嗲用进程捕捉到一个信号并从信号处理程序返回。
sleep()函数只要捕捉到一个信号就会终止sleep()函数。
作业控制信号
--SIGCHID 子进程已停止或终止
--SIGCONT 如果进程已经停止,使其继续运行
--SIGSTOP 停止信号,不能被捕捉或者忽略
--SIGTIN 后台进程组成员读控制终端
--SIGTTOU 后台进程组成员写到控制终端
除了SIGCHLD意外,大多数程序并不处理这些信号。
shell程序一般需要处理这些信号。
信号用于大多复杂的应用程序中。
理解信号处理对于Linux变成非常重要。