linux信号量通讯失败,Linux C++ 通过信号量进行跨进程通讯

最近帮着同事搞了一下嵌入式的gtk界面, 中间有用到系统signal来进行进程通讯, 做个简单的记录

在使用linux系统信号量之前需要先了解一下信号量基础知识, 这里给出一个参考博文, 讲的很仔细 : https://www.cnblogs.com/taobataoma/archive/2007/08/30/875743.html

下面是我摘录的一些个人认为的关键点 :

软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用kill发送软中断信号

内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件

注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据

到信号的进程对各种信号有不同的处理方法, 处理方法可以分为三类:

第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处

第二种方法是,忽略某个信号,对该信号不做任何处理,就象未发生过一样

第三种方法是,对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信

号的缺省操作是使得进程终止

了解了信号量基础之后, 我们来看一下如何发送信号

通常情况下, 使用 kill 命令可以向指定进程发送指定信号, 对于不同的环境发送的信号是不同的, 使用 kill -l 可以查看能够发送信号

其中有 SIGUSR1 和 SIGUSR2 两个信号提供给用户, 作为自定义信号, 那么如果想进行进程间通讯, 只需要在一个进程里调用 kill 命令, 将指定的信号发送给另一个进程, 并在另一个进程中注册对应信号的回调函数即可

下面上代码, 分享我的实现方式

首先是发送信号的进程

1 #include

2 #include

3 #include

4 #include

5

6 #include

7 #include

8

9 //执行命令并返回结果

10 void get_cmd_result(const std::string &_cmd, std::string &_result)11 {12 FILE *_cmd_result = popen(_cmd.c_str(), "r");13

14 char *buf = new char[256];15 memset(buf, 0, sizeof(buf));16

17 fread(buf, 1, sizeof(buf), _cmd_result);18 _result =buf;19

20 pclose(_cmd_result);21 deletebuf;22 buf =nullptr;23 }24

25 //向给定进程发送SIGUSR1信号

26 void send_proc_SIGUSR1(const std::string &proc_name)27 {28 std::string _cmd = "ps -a | grep" + proc_name + "| grep -v grep | awk '{print $1}'";29 std::stringproc_pid;30

31 get_cmd_result(_cmd, proc_pid);32 std::cout << "proc_pid =" << proc_pid <<:endl>

34 //system会调用 /bin/sh ,sh环境的信号量与bash环境的信号量语法不同

35 std::string emit_SIGUSR1_to_proc = "kill -USR1" +proc_pid;36 std::cout << "execute cmd :" << emit_SIGUSR1_to_proc <<:endl>

38 system(emit_SIGUSR1_to_proc.c_str());39 }40

41 intmain()42 {43 while (true)44 {45 send_proc_SIGUSR1("sig_wait");46 sleep(2);47 }48

49 return 0;50 }

下面是接收信号的进程

1 #include

2 #include

3

4 #include

5

6 voidsignal_handler()7 {8 std::cout << "get signal : SIGUSR1" <<:endl>

11 intmain()12 {13 signal(SIGUSR1, (sighandler_t)signal_handler);14

15 while(true)16 {17 std::cout << "waiting signal..." <<:endl sleep>

21 return 0;22 }

这里需要注意的点就是, sh和bash环境下, kill 命令发送信号量的格式不太一样, 具体大家可以用/bin/sh 试一下 kill -l

最后将两段代码分别编译生成两个程序 sig_send 和 sig_wait 并执行, 结果如下

sig_send :

sig_wait :

以上, , 如有疏漏, 欢迎指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode MySQL 1777. 每家商店的产品价格(行列转换)

文章目录1. 题目2. 解题1. 题目 表&#xff1a;Products ---------------------- | Column Name | Type | ---------------------- | product_id | int | | store | enum | | price | int | ----------------------(product_id,store) 是这个表的…

android 判断主线程_面试官:Android 子线程更新UI了解吗?

前言今天一个朋友去面试&#xff0c;被问到为什么Loop 死循环而不阻塞UI线程&#xff1f;为什么子线程不能更新UI&#xff1f;是不是子线程一定不可以更新UI&#xff1f;SurfaceView是为什么可以直接子线程绘制呢&#xff1f;用SurfaceView 做一个小游戏&#xff0c;别踩百块&a…

记事本linux命令换行符,Windows 10版记事本应用终于支持Linux/Mac换行符 排版不再辣眼睛...

记事本(Notepad)是微软 Windows 操作系统中相当经典的一款工具&#xff0c;其在最新的 Windows 10 操作系统中也得到了保留&#xff0c;命运比被 Photos 和 Paint 3D 取代的画图(MsPaint)程序要好得多。不过最近&#xff0c;Windows10 版记事本应用迎来了一项技能更新&#xff…

LeetCode 1885. Count Pairs in Two Arrays(二分查找)

文章目录1. 题目2. 解题1. 题目 Given two integer arrays nums1 and nums2 of length n, count the pairs of indices (i, j) such that i < j and nums1[i] nums1[j] > nums2[i] nums2[j]. Return the number of pairs satisfying the condition. Example 1: Inpu…

hal库开启中断关中断_STM32对HAL库的定时器中断

从串口中断&#xff0c;到外部中断再到现在的定时器中断&#xff0c;越来越感觉HAL库应用比较好用&#xff0c;虽然一开始理解上面有点怪&#xff0c;但是网上查询一下就能够学会。定时器中断分为两个重点&#xff0c;1、在应用CUBEMX时配置定时器的分频数以及时钟树设置 2、生…

How to Avoid Producing Legacy Code at the Speed of Typing

英语不好翻译很烂。英语好的去看原文。 About the Author I am a software architect/developer/programmer.I have a rather pragmatic approach towards programming, but I have realized that it takes a lot of discipline to be agile. I try to practice good craftsman…

c语言程序做成可执行文件,windows环境下C程序生成可执行文件

windows环境下&#xff0c;编写C程序&#xff0c;生成.exe&#xff0c;用于操作某个文件。包含三部分&#xff1a;搭建环境、程序实现、程序分析。1、搭建程序编写和编译环境在windows下安装Git Bash(下载页面)。安装完成后&#xff0c;可以在windows的任意文件夹下&#xff0c…

LeetCode MySQL 1890. 2020年最后一次登录(year)

文章目录1. 题目2. 解题1. 题目 表: Logins -------------------------- | 列名 | 类型 | -------------------------- | user_id | int | | time_stamp | datetime | --------------------------(user_id, time_stamp) 是这个表的主键。 每一…

大锅菜机器人_炒菜机或者炒菜机器人有好用的吗 - 玩主论坛

好像公司还在&#xff0c;出新型号了。智能烹饪机炒菜视频&#xff1a;http://videotudoucom/v/XMTk3MDkwNDU5Nghtml智能烹饪机将主(菜、肉、鱼……)副料一次性投入&#xff0c;选定菜系&#xff0c;轻触按钮&#xff0c;一般家常菜肴仅三分钟即可出锅食用。本机具有自动翻炒功…

高效开发--crm开发有悟

今天我计划许久的回访单功能模块&#xff0c;还是没有实现&#xff0c;没有搞定。心中很是苦闷啊&#xff01;&#xff01;&#xff01;原因&#xff1a;自己想去吧。以后怎么做&#xff1a;什么也是纸老虎&#xff0c;程序研发太简单&#xff0c;只要弄清了需求&#xff0c;其…

LeetCode MySQL 1873. 计算特殊奖金(case when then else end)

文章目录1. 题目2. 解题1. 题目 表: Employees ---------------------- | 列名 | 类型 | ---------------------- | employee_id | int | | name | varchar | | salary | int | ----------------------employee_id 是这个表的主键。 此表的每…

href 带参数 打开exe_js调用winform程序(带参数)

我们会发现,我们点击迅雷下载的时候 网页可以调用应用程序,而且连接会传入迅雷,这个是怎么做到的呢?原理: 先注册表中添加软件的具体信息,然后通过 href 可以直接调用1.写入注册表信息,注册,如果不需要参数 只要第一个HKEY_CLASSES_ROOT\test 段落Windows Registry Editor Ve…

c语言variant是什么变量,介绍一些常用数据类型的使用。先定义一些常见类型变量借以.doc...

介绍一些常用数据类型的使用。先定义一些常见类型变量借以说明int i 100;long l 2001;float f300.2;double d12345.119;char username[]"张三";char temp[200];char *buf;CString str;_variant_t v1;_bstr_t v2;一、其它数据类型转换为字符串短整型(int)itoa(i,tem…

What code you will get when you create a wcf library

创建wcf服务库的时候&#xff0c;系统自动生成的代码 // 注意: 使用“重构”菜单上的“重命名”命令&#xff0c;可以同时更改代码和配置文件中的接口名“IService1”。[ServiceContract]public interface IService1{[OperationContract]string GetData(int value);[OperationC…

LeetCode 1868. 两个行程编码数组的积(双指针)

文章目录1. 题目2. 解题2.1 模拟超时2.2 优化1. 题目 行程编码&#xff08;Run-length encoding&#xff09;是一种压缩算法&#xff0c;能让一个含有许多段连续重复数字的整数类型数组 nums 以一个&#xff08;通常更小的&#xff09;二维数组 encoded 表示。 每个 encoded[…

结巴分词有前空格_jieba英文空格分词问题

1.对于关键词存在空格或者特殊符号的情况下&#xff0c;jieba无法分出该词2.在github上找到了一个解决方案&#xff0c;修改jieba源码__init__.py免费分享&#xff0c;造损免责。打开默认词典(根目录)或自定义词典&#xff0c;把所有用来间隔词频和词性的空格间隔符改成(选用是…

linux socket 面试题,面试题

1、网络TCP/IP协议2、三层路由架构&#xff0c;搭建局域网3、自动化测试工具robotframework的使用&#xff0c;怎么管理测试脚本4、shell脚本可用过&#xff1f;怎么替换一个文本中指定的内容&#xff1f;5、python的多线程怎么使用的&#xff1f;正则表达式中serach和match的区…

Core Location :⽤用于地理定位

Core Location :⽤用于地理定位 在移动互联⽹网时代,移动app能解决⽤用户的很多⽣生活琐事,⽐比如 导航:去任意陌⽣生的地⽅方 周边:找餐馆、找酒店、找银⾏行、找电影院 在上述应⽤用中,都⽤用到了地图和定位功能,在iOS开发中,要想加⼊入这2⼤大功 能,必须基于2个框架进⾏…

LeetCode MySQL 1587. 银行账户概要 II

文章目录1. 题目2. 解题1. 题目 表: Users ----------------------- | Column Name | Type | ----------------------- | account | int | | name | varchar | -----------------------account 是该表的主键. 表中的每一行包含银行里中每一个用户的账号…

取多补少C语言,leetcode题目: 数字的补数 的C语言解法

题目链接题目内容给定一个正整数&#xff0c;输出它的补数。补数是对该数的二进制表示取反。注意:给定的整数保证在32位带符号整数的范围内。你可以假定二进制数不包含前导零位。示例 1:输入: 5输出: 2解释: 5的二进制表示为101(没有前导零位)&#xff0c;其补数为010。所以你需…