linux系统编程之信号(三)
今天继续对信号进行研究,话不多说,言归正传:

#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <fcntl.h> #include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h> #define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while() void handler(int sig);
int main(int argc, char *argv[])
{
if (signal(SIGALRM, handler) == SIG_ERR)//注册了一个alrm信号
ERR_EXIT("signal error"); alarm();//发送一个alarm信号
for (;;)
pause();
return ;
} void handler(int sig)
{
printf("recv a sig=%d\n", sig);
}
关于alarm函数的说明可以查看man:

运行效果:

可见,是隔了一秒才发送出alarm信号的,实际上,我们可以找到该进程,用shell命令中人为的发送该信号:

通过kill命令来发送信号,为了看到效果,新开一个命令终端,效果如下:

可以看到手动发送信号也是可以正常收到的,另外,我们在发送信号时,既可以用数字,也可以用它对应的名称,如下:


实际上,对于进程的ID,可以通过动态方式来获取,按如下步骤(了解一下):
1、先过滤掉其它行

2、然后再只得到进程ID列,过滤掉其它列







#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <fcntl.h> #include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h> #define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while() typedef struct
{
int a;
int b;
} TEST; TEST g_data;//定义了一个全局变量,是为了说明不可重入函数的问题 void handler(int sig);
int main(int argc, char *argv[])
{
TEST zeros = {, };
TEST ones = {, };
if (signal(SIGALRM, handler) == SIG_ERR)
ERR_EXIT("signal error"); g_data = zeros;//默认赋值
alarm();
for (;;)
{
g_data = zeros;
g_data = ones;//不断对其进行赋值,正常情况应该要不是zeros,要不就是ones
}
return ;
} void handler(int sig)
{
printf("%d %d\n", g_data.a, g_data.b);//打印出值,观察其输出可以看到不可重录函数的缺点
alarm();
}
编译运行:

这是为什么呢?
这是由于有一个全局变量g_data,而且在for循环中不断进行赋值,

由于赋值不是一个原子操作,拿g_data=zeros这个赋值操作来说,由两部组成:
①g_data.a = zeros.a;
②g_data.b = zeros.b





linux系统编程之信号(三)的更多相关文章
- linux系统编程之信号(七)
今天继续学习信号,主要是学习关于时间和定时器相关的函数的使用,关于这个实际上有很多内容,这里先简要进行说明,等之后再慢慢进行相关深入,也主要是为接下来要做的一个综合linux系统编程的例子做准备,好了 ...
- linux系统编程之管道(三)
今天继续研究管道的内容,这次主要是研究一下命名管道,以及与之前学过的匿名管道的区别,话不多说,进入正题: 所以说,我们要知道命名管道的作用,可以进行毫无关系的两个进程间进行通讯,这是匿名管道所无法实现 ...
- linux系统编程之信号(一):中断与信号
一,什么是中断? 1.中断的基本概念 中断是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后又返回原来被 ...
- linux系统编程之信号(二)
经过了漫长的间歇,对于c语言的学习也被中断了很久,现实确实有很多的无耐,计划中的事情总会被打乱,但不管怎样,学习的道路是不能休止的,所以经过了一断温习后现在继续学习C语言,话不多说,进入正题: 信号分 ...
- linux系统编程之信号(三):信号安装、signal、kill,arise讲解
一,信号安装 如果进程要处理某一信号,那么就要在进程中安装该信号.安装信号主要用来确定信号值及进程针对该信号值的动作之间的映射关系,即进程将要处理哪个信号:该信号被传递给进程时,将执行何种操作. li ...
- linux系统编程之信号(八):三种时间结构及定时器setitimer()详解
一,三种时间结构 time_t://seconds struct timeval { long tv_sec; /* seconds */ long tv_usec; /* microsecond ...
- linux系统编程之信号(二):信号处理流程(产生、注册、注销、执行)
对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,可以分为三个阶段: 信号诞生 信号在进程中注册 信号在进程中的注销 信号处理函数执行 1 信号诞生 信号事件 ...
- linux系统编程之信号(一)
今天起,开始新的知识的学习,对于上个系列进程的学习还差一个理论上的总结,这个会下次补回来,以便通过实践之后,再用理论将其巩固一下,好了,话不多说,开始进入这个主题的学习----信号,很重要,但不是太容 ...
- linux系统编程之信号(七):被信号中断的系统调用和库函数处理方式
一些IO系统调用执行时, 如 read 等待输入期间, 如果收到一个信号,系统将中断read, 转而执行信号处理函数. 当信号处理返回后, 系统遇到了一个问题: 是重新开始这个系统调用, 还是 ...
随机推荐
- java里的static/final含义
java里的static/final含义 static static可以修饰:属性,方法,代码段,内部类(静态内部类或嵌套内部类) static修饰的属性的初始化在编译期(类加载的时候),初始化后能改 ...
- dubbo调用外网接口 注册外网ip到zookeeper 暴露外网ip
dubbo注册时会通过主机名寻找ip,会将内网ip注册到zookeeper 如果我们调用外网服务器server的话是找不到的 会报如下错误 [DUBBO] client reconnect to 12 ...
- C#基于RabbitMQ实现客户端之间消息通讯实战演练
一.背景介绍和描述 MQ消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.何时需要消息队列?当你需要使用 ...
- 微设计基础架构(MDI)
微设计基础架构(MDI) 了解微设计基础架构(MDI)的概念,它们如何帮助开发,以及它们与DevOps和微服务等技术的关系. 技术决策既困难又严肃,可以决定项目的成败.如何找到合适的技术栈?“微设计基 ...
- 2017ACM/ICPC广西邀请赛 1004 Covering
Covering Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- php imagick生成gif动画的方法
>php imagick生成gif动画的方法<pre><?php$image=new Imagick();$animation = new Imagick(); //建立一个对 ...
- 查看端口被哪个程序占用的DOS命令
netstat -aon | findstr 80Proto Local Address Foreign Address State PID==== ============ ============ ...
- XML解析详解|乐字节
大家好,乐字节的小乐又来了,Java技术分享哪里少的了小乐!上次我们说了可扩展标记语言XML之二:XML语言格式规范.文档组成,本文将介绍重点——XML解析. 基本的解析方式有两种:一种叫 SAX ...
- Windows连接已有界面的Ubuntu Linux
Windows连接已有界面的Ubuntu Linux xrdp方式windows 10连接ubuntu 18.04 LTS 1. Ubuntu设置 Ubuntu的设置->Sharing项修改为下 ...
- [转帖]Reactor模式
Reactor模式 https://www.cnblogs.com/crazymakercircle/p/9833847.html 看不懂代码 只看的图.. 疯狂创客圈,一个Java 高并发研习社群 ...