进程同步(三)—— 信号

程序在执行过程经常产生信号,有些是由内核发出,有些是由用户发出。 执行命令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 条评论
登录 后参与评论

相关文章

来自专栏技术栈大杂烩

Linux: 关于 SIGCHLD 的更多细节

对该机制有稍微了解的话,不难得知一个关键因素:SIGCHLD。正是这个SIGCHLD起到了通知的作用,所以后面的处理也是基于它而实现。

1526
来自专栏黑白安全

Nginx中如何限制某个IP同一时间段的访问次数

如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候。其中CC攻击(Challenge Collapsar)是DDO...

1354
来自专栏博客园

静态文件

   静态文件通常位于 Web root(<content-root>/wwwroot)文件夹下

1491
来自专栏蓝天

UNIX和Linux信号

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

1614
来自专栏张善友的专栏

.NET Core 系列5 :使用 Nuget打包类库

NuGet是个开源项目,项目包括 NuGet VS插件/NuGet Explorer/NuGetServer/NuGet命令行等项目,.NET Core项目完全...

2315
来自专栏乐沙弥的世界

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

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

1331
来自专栏依乐祝

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

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

1090
来自专栏ASP.NETCore

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

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

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

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

2592
来自专栏程序你好

ASP.NET Core MVC 概述

1122

扫码关注云+社区