进程同步(三)—— 信号

程序在执行过程经常产生信号,有些是由内核发出,有些是由用户发出。 执行命令kill -l可以查看信号。

这些信号由系统定义,他们不是简单的int之类的数据类型,可能是调用一些函数。 这些信号中,10/12是给用户预留使用的,其他信号各有自己相应的含义。代码中无法完美的自定义信号,容易覆盖或产生系统错误,所以还是乖乖用系统提供的信号吧。 信号类似QT的信号槽的关系,一个信号对应一个处理函数,可以对相应的信号进行屏蔽之类的处理。

信号处理函数属于可重入函数,可以随时中断,允许多个副本执行。 信号处理属于异步处理,和主程是分开执行的,内核发送信号只发送一次。一般处理函数仅仅用于通知主程收到信号,有主程处理具体内容。

下面是信号处理代码,分别是内核发送的子进程结束信号和用户自定义信号。 1 #include <sys/types.h> 2 #include <unistd.h> 3 #include <sys/wait.h> 4 #include <signal.h> 5 #include <string.h> 6 #include <iostream> 7 #include <stdlib.h> 8 9 using namespace std; 10 11 class sigOp 12 { 13 public: 14 void addSigProcess(int sig,void (*func)(int)); 15 void sendSig(const int sig, const int pid); 16 }; 17 void sigOp::addSigProcess(int sig,void (*func)(int)) 18 { 19 struct sigaction stuSig; 20 memset(&stuSig, '\0', sizeof(stuSig)); 21 stuSig.sa_handler = func; 22 stuSig.sa_flags |= SA_RESTART; 23 sigfillset(&stuSig.sa_mask); 24 sigaction(sig, &stuSig, NULL); 25 } 26 void sigOp::sendSig(const int sig, const int pid) 27 { 28 kill(pid, sig); 29 cout<<"send!"<<endl; 30 } 31 void recSig(int sig) 32 { 33 cout<<"rev sig!"<<endl; 34 } 35 void waitchlid(int sig) 36 { 37 pid_t pid; 38 int stat; 39 while((pid = waitpid(-1, &stat, WNOHANG)) > 0); 40 } 41 int main() 42 { 43 sigOp sig; 44 sig.addSigProcess(SIGUSR1, recSig); 45 sig.addSigProcess(SIGCHLD, waitchlid); 46 pid_t pid = fork(); 47 if (pid > 0) 48 { 49 sig.sendSig(SIGUSR1, pid); 50 } 51 else 52 { 53 return 0; 54 } 55 while(1); 56 return 0; 57 }

当我们不处理SIGCHLD信号时,利用ps -aux查看,可以看到进程属于僵尸态。

收到SIGCHLD信号,并且waitpid回收后,没有僵尸进程。 测试结果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

原来Silverlight 4中是可以玩UDP的!

Silverlight3中的scoket只支持tcp协议,而对于udp一直以安全原因拒绝支持,但在silverlight4中可以惊喜的发现 System.Net...

19890
来自专栏蓝天

UNIX和Linux信号

1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。不可靠信号和可靠信号的区...

25240
来自专栏WebDeveloper

Thinkphp的cron计划任务

cron1默认在ThinkPHP\Library\Cron\cron1.php如果没有cron目录则新建一个,cron1.php自己所要执行的脚本

24030
来自专栏乐沙弥的世界

Vmware server 下为Oracle RAC 添加共享磁盘

    在VMware下的Oracle RAC 环境中,对于共享存储不够或者需要增加新的共享磁盘来配置ocr或votingdisk的多路镜像,我们可以通过vmw...

22810
来自专栏林德熙的博客

win10 uwp 绑定密码

win10 下,密码框无法绑定到ViewModel,Password是不可以绑定。 我们可以自己使用简单方法去绑定。

7510
来自专栏葡萄城控件技术团队

Asp.Net MVC4入门指南(10):第三方控件Studio for ASP.NET MVC4 工具应用

ComponentOne Studio for ASP.NET最新版本2013V1支持MVC4,其中包括: 新增 MVC 4 工程模板 (C# & VB) 开箱...

25190
来自专栏依乐祝

.NET Core部署中你不了解的框架依赖与独立部署

框架依赖的部署:顾名思义,依赖框架的部署 (FDD) 依赖目标系统上存在共享系统级版本的 .NET Core。 由于已存在 .NET Core,因此应用在 .N...

21920
来自专栏章鱼的慢慢技术路

Linux操作_常用命令操作练习

31720
来自专栏ASP.NETCore

细说ASP.NET Core静态文件的缓存方式

  我们在优化Web服务的时候,对于静态的资源文件,通常都是通过客户端缓存、服务器缓存、CDN缓存,这三种方式来缓解客户端对于Web服务器的连接请求压力的。

23620
来自专栏依乐祝

使用Visual Studio Code开发.NET Core看这篇就够了

在本文中,我将带着大家一步一步的通过图文的形式来演示如何在Visual Studio Code中进行.NET Core程序的开发,测试以及调试。尽管Visual...

23700

扫码关注云+社区

领取腾讯云代金券