【Linux之进程间通信】04.Linux进程间的信号通信

这篇具有很好参考价值的文章主要介绍了【Linux之进程间通信】04.Linux进程间的信号通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 
【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) 的信号处理函数

实现现象:
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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux下的系统编程——进程间的通信(九)

    前言:  前面我们已经对进程已经有了一个简单的了解与认识,那么进程间的通信是什么样的呢,什么是父子进程,什么是兄弟进程,没有血缘关系间的进程是如何实现进程通信的,下面让我们一起学习一下什么是进程间的通信吧。 目录 一、进程间通信常用方式 IPC方式:

    2024年02月09日
    浏览(34)
  • 【Linux】进程通信 — 信号(下篇)

    上一篇我们讲述了信号的基本概念和相应系统接口的使用,本章我们想更深入的学习信号发送的一系列过程,目标已经确定,接下来就要搬好小板凳,准备开讲了…🙆🙆🙆🙆 实际执行信号的处理动作称为信号递达(Delivery)。 信号从产生到递达之间的状态,称为信号未决(P

    2024年02月09日
    浏览(37)
  • linux进程间通信(信号量)

    信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待(即 P(信号变量))和发 送(即 V(信号变量))信息操作。最简单的信号量是只能取 0 和 1 的变量,这也是信号量最常见的一种形式, 叫做二进制信号量。而可以取多个正整数的信号量被称为通用信号

    2024年02月07日
    浏览(38)
  • 【Linux】进程间通信之信号机制

    信号是一个程序中断,且是一个软中断,收到一个信号后,具体怎么处理该信号,什么时候处理是由进程决定的,所以是软中断。 信号的种类:使用 kill -l 命令可以查看有多少个信号 1~31是非可靠信号 34~64是可靠信号 非可靠信号:当前信号有可能丢失,丢失就无法执行该信号

    2024年02月12日
    浏览(38)
  • 【Linux】进程间通信 -- 信号量

    信号量是什么? 本质是一个计数器,通常用来表示公共资源中,资源数量多少的问题 公共资源:能被多个进程同时可以访问的资源 访问没有保护的公共资源:数据不一致问题(比如我想写abc123,但是我123还没有写入,就读取了abc,可能数据分开会导致数据无意义) 为什么要

    2024年02月16日
    浏览(47)
  • Linux进程间通信【消息队列、信号量】

    ✨个人主页: 北 海 🎉所属专栏: Linux学习之旅 🎃操作环境: CentOS 7.6 阿里云远程服务器 在 System V 通信标准中,还有一种通信方式: 消息队列 ,以及一种实现互斥的工具: 信号量 ;随着时代的发展,这些陈旧的标准都已经较少使用了,但作为 IPC 中的经典知识,我们可

    2024年02月08日
    浏览(62)
  • 【Linux】进程间通信——System V信号量

    目录 写在前面的话 一些概念的理解 信号量的引入 信号量的概念及使用            System V信号量是一种较低级的IPC机制 ,使用的时候需要手动进行操作和同步。在现代操作系统中,更常用的是 POSIX信号量 (通过 sem_* 系列的函数进行操作)或更高级的同步原语(如互斥锁

    2024年02月11日
    浏览(48)
  • 【Linux】进程间通信 --- 管道 共享内存 消息队列 信号量

    等明年国庆去西藏洗涤灵魂,laozi不伺候这无聊的生活了 1. 通过之前的学习我们知道,每个进程都有自己独立的内核数据结构,例如PCB,页表,物理内存块,mm_struct,所以具有独立性的进程之间如果想要通信的话,成本一定是不低的。 2. a.数据传输:一个进程需要将它的数据

    2023年04月17日
    浏览(50)
  • 【Linux】进程间通信之共享内存/消息队列/信号量

    共享内存是通过让不同的进程看到同一个内存块的方式。 我们知道,每一个进程都会有对应的PCB-task_struct ,独立的进程地址空间,然后通过页表将地址映射到物理内存中。此时我们就可以让OS在内存中申请一块空间,然后将创建好的内存空间映射到进程的地址空间中,两个需

    2024年02月05日
    浏览(49)
  • Linux进程间通信 - 信号(signal) 与 管道(pipe) 与 消息队列

    什么是进程间通信,就是进程与进程之间进行通信,互相发送消息;可以通过 信号 或者 管道 或者 消息队列 或者 信号量 去通信! 目录 一、信号 1. 信号简介  2. 都有那些信号? 3. 注册信号的函数 1). signal 2). sigaction (项目中强烈推荐使用) 4. 信号发送 1). kill 函数 2). alarm 函

    2024年02月01日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包