【Linux之进程间通信】
项目代码获取:https://gitee.com/chenshao777/linux-processes.git
(麻烦点个免费的Star哦,您的Star就是我的写作动力!)
04.Linux进程间的信号通信
【目录】
一、进程间信号发送方式
二、进程间信号接收方式
三、进程间信号处理方式
一、进程间信号发送方式
1、kill函数
向指定进程发送信号
int kill(pid_t pid, int sig)
需要包含头文件
#include <sys/types.h>
#include <signal.h>
参数:
参数 | 含义 |
---|---|
pid | 进程pid(发送给哪个进程) |
sig | 要发送的信号值(Linux一共64个信号,kill -l 即可查看) |
举例:
这有一个死循环进程
#include <stdio.h>
/*四循环进程*/
int main(int argc, char *argv[])
{
while(1);
return 0;
}
运行 ps -axj 命令查看一下它的状态是R+,表示正在运行,且进程号是23409
4070 23409 23409 4070 pts/1 23409 R+ 1000 1:05 ./test_while
我们可以在终端执行 kill -9 23409 命令来结束该进程,但我们要通过代码来结束该进程
核心代码则为
kill(23409, SIGKILL); //发送kill信号,结束23409进程
但是我们事先不知道进程号,所以可以通过 main 函数的参数传递进程号,执行命令如下:
./1.out 9 23409
全部代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>
/*
模拟 kill 命令,杀死进程
命令:./1.out 9 进程号(ps -axj)
*/
int main(int argc, char *argv[])
{
if(argc < 3){
printf("请输入两个参数\n");
return -1;
}
int sig;
int pid;
sig = atoi(argv[1]);
pid = atoi(argv[2]);
kill(pid, sig);
printf("111\n");
return 0;
}
PS:使用到了 atoi 函数,将字符串转成数字,需要包含头文件 <stdlib.h>
---------------------------------------------------------------------------------
2、raise函数
只能向自身进程发送信号
int raise(int sig);
需要包含头文件
#include <signal.h>
参数:
sig : 要发送的信号
举例:
raise(SIGTSTP); //暂停进程
raise(9); //杀死自己
---------------------------------------------------------------------------------
3、alarm函数
发送闹钟信号
unsigned int alarm(unsigned int seconds);
需要包含头文件
#include <unistd.h>
参数:
闹钟定时的秒数
举例:
执行 alarm(5) ,5秒后进程结束
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
alarm(5); //5秒后结束自己的进程
printf("22222\n");
pause(); //进程睡眠
return 0;
}
二、进程间信号接收方式
这里介绍三种方式,确保进程能够收到信号
while 循环
pause 进程睡眠
sleep 延时
三、进程间信号处理方式
使用信号处理函数 signal()
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
需要包含头文件
#include <signal.h>
参数:
参数 | 含义 |
---|---|
signum | 信号 |
handler | 信号触发后的回调函数(void类型,参数int类型) |
handler有三种选择
SIG_IGN:忽略该信号
SIG_DFL:采用默认方式处理信号
函数指针:自定义信号处理函数
举例:
使用signal函数定义信号SIGALRM(闹钟信号) 和 SIGINT(ctrl+c) 的信号处理函数文章来源:https://www.toymoban.com/news/detail-457258.html
实现现象:
5秒后handler函数执行,或者按下ctrl+c,handler函数执行文章来源地址https://www.toymoban.com/news/detail-457258.html
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
/*
定义信号处理函数
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
参数:
signum: 指定信号
handler: SIG_IGN:忽略该信号
SIG_DFL:采用默认方式处理信号
函数指针:自定义信号处理函数
命令: ./signal
现象:5秒后handler函数执行,或者按下ctrl+c,handler函数执行
*/
void handler(int arg)
{
printf("信号处理handler,arg = %d\n", arg); //arg是信号ID
}
int main(int argc, char *argv[])
{
signal(SIGALRM, handler); //SIGALRM闹钟信号处理
signal(SIGINT, handler); //SIGINT(ctrl+c)信号处理
alarm(5); //5秒后结束自己的进程
printf("22222\n");
pause(); //进程睡眠
return 0;
}
到了这里,关于【Linux之进程间通信】04.Linux进程间的信号通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!