`
jishublog
  • 浏览: 868502 次
文章分类
社区版块
存档分类
最新评论

Linux c 信号—pause、sigsuspend 的相同于区别

 
阅读更多

pause函数:

功能:让进程暂停直到信号出现

#include<unistd.h>

intpause();

函数说明:pause()会令目前的进程暂停(进入睡眠状态),直至信号(signal)所中断。

返回值:只返回-1

例子:

#include<stdio.h>

#include<unistd.h>

void deal()

{

printf(“信号干扰!\n”);

}

void main()

{

printf(“进程执行!\n”);

signal(SIGINT,deal);

pause();

printf(“进程结束!\n”);

}

说明:

当程序运行时,pause会使当前的进程挂起(进入睡眠状态),直到我们向该进程发送SIGINT中断信号,进程才会被唤醒,并处理信号,处理完信号后pause函数才返回,并继续运行该程序。注:任何信号都可是pause唤醒。

sigsuspend函数:

#include<signal.h>

intsigsuspend(const sigset_t *sigmask);

返回值:-1

sigsuspend函数和pause函数一样,可以是进程挂起(进入睡眠状态),直至有信号发生。

sigsuspend函数的参数是一个信号集,这个信号集是用来屏蔽信号的,信号集中存放了要屏蔽的信号。

如果该信号集为空的话,sigsuspend就不屏蔽任何信号,任何信号都可以使进程从挂起状态唤醒,这就与pause函数一样了。

例子:

#include<stdio.h>

#include<unistd.h>

#include<signal.h>

void deal()

{

printf(“信号干扰!\n”);

}

void main()

{

sigset_tsigmask;

sigemptyset(&sigmask);

printf(“进程执行!\n”);

signal(SIGINT,deal);

sigsuspend(&sigmask);

printf(“进程结束!\n”);

}

说明:

该例子与上面pause函数的例子是一样的。

sigsuspendpause的不同处:

sigsuspend函数是pause函数的增强版。当sigsuspend函数的参数信号集为空信号集时,sigsuspend函数是和pause函数是一样的,可以接受任何信号的中断。

但,sigsuspend函数可以屏蔽信号,接受指定的信号中断。

sigsuspend函数=pause函数+指定屏蔽信号

注:信号中断的是sigsuspendpause函数,不是程序代码。

sigsuspend是否影响sigprocmask屏蔽的信号呢?

影响.使原来的屏蔽信号全部失效.

当sigsuspend返回,恢复原来的屏蔽信号.、

sigsuspend什么时候使用?

当我们的程序在进行一些业务处理的时候不想被一些信号所中断,我们就可以先屏蔽这些信号,在这个业务处理结束时我们可以使用sigsuspend函数处理在排队的信号(在这个过程中也可指定屏蔽的信号),处理完成后,在恢复之前的信号屏蔽,并处理下个业务处理。

例子:

#include<stdio.h>

#include<unistd.h>

#include<signal.h>

void deal()

{

printf(“信号处理中!\n”);

}

void main()

{

sigset_t sigs,sigmask;

int i;

signal(SIGINT,deal);

sigemptyset(&sigs); //sigsuspend的信号集设置空,表示会sigsuspend会处//理任何信号,如果想在处理排队的信号时屏蔽一些 //信号,可以把相应的信号加到信号集中

sigemptyset(&sigmask);

sigaddset(SIGINT,&sigs);

sigprocmask(SIG_BLOCK,&sigs,0); //屏蔽sigint信号,使其不能再业务处理过程中干//扰进程。

for(i=0 ; i<5 ; i++)

{

printf(“处理业务中…..\n”); //模拟业务处理

sleep(5)

printf(“处理业务结束\n”);

sigsuspend(&sigmask); //处理正在排队的信号,处理信号完毕后,

//sigsuspend函数才返回,并执行下个业务处理

printf(“处理业务中…..\n”); //模拟业务处理

sleep(5)

printf(“处理业务结束\n”);

}

}

说明:在sigsuspend函数调用时,会使进程挂起(进入睡眠状态)等待信号的中断,如果没有信号发生,进程会一直挂起,当有信号发生时,但该信号不是sigsuspend函数的信号集中所设置的屏蔽的信号时,sigsuspend会处理该信号,当该信号处理完成后,sigsuspend函数才返回,并执行接下来的代码。

分享到:
评论

相关推荐

    C语言中的pause()函数和alarm()函数以及sleep()函数

    C语言pause()函数:让进程暂停直到信号出现 头文件: #include 定义函数: int pause(void); 函数说明:pause()会令目前的进程暂停(进入睡眠状态), 直到被信号(signal)所中断. 返回值:只返回-1. 错误代码:...

    kubernetes pause基础镜像 3.0版本 pause.tar

    k8s pause容器镜像3.0,有需要直接下载使用,docker load -i pause.tar

    Linux C 一站式学习

    C语言入门 C语言本质 Linux系统编程 28. 文件与I/O 1. 汇编程序的Hello world 2. C标准I/O库函数与Unbuffered I/O函数 3. open/close 4. read/write 5. lseek 6. fcntl 7. ioctl 8. mmap 29. 文件系统 1. 引言 2. ...

    linux 下实现sleep详解及简单实例

    linux 下实现sleep详解及简单实例 sleep: 普通版本 1、基本设计思路:  1&gt;注册SIGALRM信号的处理函数;  2&gt;调用alarm(nsecs)设定闹钟;  3&gt;调⽤pause等待,内核切换到别的进程运行;  4&gt;nsecs秒之后,闹钟超时,内...

    k8s.gcr.io/pause:3.1镜像包

    kubernetes的k8s.gcr.io/pause:3.1镜像包,版本为3.1。文件是pause_3_1.tar

    pause_3.1.tar

    k8s.gcr.io/pause:3.1镜像tar包,使用 docker load --input pause_3.1.tar进行导入

    k8s pause-3.1

    pause-3.1镜像,镜像使用方法: docker load -i pause-3.1.tar.gz

    pause-3.2.tar.gz

    │ ├── pause-3.2.tar.gz │ └── pod2daemon-flexvol-v3.15.1.tar.gz ├── save.sh └── server ├── cni-v3.15.1.tar.gz ├── coredns-1.6.7.tar.gz ├── etcd-3.4.3-0.tar.gz ├── kube-api...

    c处理函数 学习c精通必备

    很不错的资源pause(让进程暂停直到信号出现)  相关函数 kill,signal,sleep  表头文件 #include  定义函数 int pause(void);  函数说明 pause()会令目前的进程暂停(进入睡眠状态),直到被信号(signal)...

    Linux内核源代码情景分析 (上下册 高清非扫描 )

    1.4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 ...

    jquery.pause让动画模块暂停各恢复运行示例.rar

    因此Pause插件扩充了animate() 的功能,让它可以支持暂停(pause)及恢复(resume)动画。 这个插件覆盖jQuery的默认的animate()方法,任何加载了这个插件的动画都将支持Pause暂停。两个新的不带任何参数的方法被添加...

    kubernetes镜像pause-amd打包

    kubernetes镜像pause-amd打包

    pause容器定制

    pause容器制作!!!!

    pause工作原理

    详细说明了pause的工作原理及工作机制,适合了解k8s工作原理的同学!

    Linux操作系统下C 语言编程

    Linux操作系统下C 语言编程指南 (中文版)

    lizhenliang-pause-amd64.tar

    lizhenliang-pause-amd64.tar

    kubernetes之pause-3.4.1.tar.gz下载

    kubernetes之pause-3.4.1.tar.gz下载

    Pause Controller

    用于暂停场景的Unity插件,可暂停某个或者所有物体。版本1.0

    linux内核源代码情景分析

    1.4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的...

    《Linux系统编程、网络编程》第6章 信号

    课程内容:学习本章的意义、Linux下都有哪些信号、signal函数、子进程对父进程信号的集成情况、kill、raise、alarm、pause、abort函数、信号休眠函数的唤醒、信号的发送、接收和处理的过程、如何调用API修改信号的...

Global site tag (gtag.js) - Google Analytics