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 :

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值