在进行堵塞式系统调用时。为避免进程陷入无限期的等待,能够为这些堵塞式系统调用设置定时器。Linux提供了alarm系统调用和SIGALRM信号实现这个功能。
        要使用定时器。首先要安装SIGALRM信号。假设不安装SIGALRM信号,则进程收到SIGALRM信号后。缺省的动作就是终止当前进程。

SIGALRM信号成功安装后,在什么情况下进程会收到该信号呢?这就要依赖于Linux提供的定时器功能。在Linux系统下,每一个进程都有惟一的一个定时器,该定时器提供了以秒为单位的定时功能。在定时器设置的超时时间到达后,调用alarm的进程将收到SIGALRM信号。

alarm系统调用的原型为:

#include <unistd.h>
unsigned int alarm(unsigned int seconds);
參数说明:
1)seconds:要设定的定时时间,以秒为单位。在alarm调用成功后開始计时。超过该时间将触发SIGALRM信号。
返回值:
返回当前进程曾经设置的定时器剩余秒数。


例8-10:编程利用SIGALRM信号实现秒定时器。
代码例如以下:
#include <stdio.h>
#include <signal.h>
//全局计数器变量
int Cnt=0;
//SIGALRM信号处理函数
void CbSigAlrm(int signo)
{
//输出定时提示信息
printf("   seconds: %d",++Cnt);
printf("\r");
//又一次启动定时器,实现1秒定时
alarm(1);
}
void main()
{
//安装SIGALRM信号
if(signal(SIGALRM,CbSigAlrm)==SIG_ERR)
{
perror("signal");
return;
}
//关闭标准输出的行缓存模式
setbuf(stdout,NULL);
//启动定时器
alarm(1);
//进程进入无限循环,仅仅能手动终止
while(1)
{
//暂停,等待信号
pause();
}
}

8.5.2 SIGCLD信号
        在Linux的多进程编程中,SIGCLD是一个很重要的信号。当一个子进程退出时。并非马上释放其占用的资源,而是通知其父进程,由父进程进行兴许的工作。

在这一过程中,系统将依次产生下列事件。

1)向父进程发送SIGCLD信号,子进程进入zombie(僵尸)状态。
2)父进程接收到SIGCLD信号,进行处理。
        假设在上述过程中父进程既没有忽略SIGCLD信号。也未捕获该信号进行处理,则子进程将进入僵尸状态。僵尸状态的进程不能被操作系统调用,也没有不论什么可执行代码,它只是是占用了进程列表中的一个位置而已。

假设仅有几个僵尸进程不会影响系统的执行,可是假设僵尸进程过多。则将会严重影响系统的执行。因此,在编程过程中应避免产生僵尸进程。有两种主要的处理方法能够避免产生僵尸进程:一是父进程忽略SIGCLD信号;二是父进程捕获SIGCLD信号,在信号处理函数中获取子进程的退出状态。忽略信号的方式比較简单。仅仅须要调用signal(SIGCLD,SIG_IGN)语句就可以完毕。假设要捕获信号并处理。那么先要安装SIGCLD信号,然后在信号处理函数中调用wait或者waitpid等函数获取子进程的退出状态。


例8-11:编程捕获SIGCLD信号。输出各子进程的ID和退出状态码。

代码例如以下:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
//SIGCLD信号处理函数
void CbSigCld(int signo)
{
//保存退出进程的ID
int pid;
//保存退出进程的退出状态码
int status;
//等待不论什么一个子进程退出
pid=waitpid(-1,&status,0);
//输出退出的子进程ID和退出代码
printf("Child process %d exit with status %d\n",pid,status);
}
void main()
{
int i,pid;
//安装SIGCLD信号
if(signal(SIGCLD,CbSigCld)==SIG_ERR)
{
perror("signal");
return;
}
//循环创建子进程
for(i=0;i<5;i++)
{
pid=fork();
//假设是子进程
if(pid==0)
{
//退出子进程,退出状态码为0
exit(0);
}
//假设是父进程
else
{
sleep(1);
}
}
}

linux中的两个很重要的信号:SIGALRM信号和SIGCHID信号的更多相关文章

  1. Linux中的两种守护进程stand alone和xinetd

    Linux中的两种守护进程stand alone和xinetd --http://www.cnblogs.com/itech/archive/2010/12/27/1914846.html#top 一 ...

  2. Linux中的两个经典宏定义:获取结构体成员地址,根据成员地址获得结构体地址;Linux中双向链表的经典实现。

    倘若你查看过Linux Kernel的源码,那么你对 offsetof 和 container_of 这两个宏应该不陌生.这两个宏最初是极客写出的,后来在Linux内核中被推广使用. 1. offse ...

  3. linux中的两个命令setfacl和chmod有什么区别

    setfacl命令可以用来细分linux下的文件权限.chmod命令可以把文件权限分为u,g,o三个组,而setfacl可以对每一个文件或目录设置更精确的文件权限. 比较常用的用法如下:setfacl ...

  4. Linux中一些 不是很常用的配置修改

    1,让虚拟机屏幕最大化 :查看-->自动调整大小-->自动适应客户机 2,让虚拟机取消屏保: system --> preferences --> Screensaver

  5. linux中删除目录

    在linux中删除一个目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中,现在使用rm -rf命令即可解决. 直接rm就可以了,不过要加两个参数-rf 即:rm -rf 目 ...

  6. linux中的vi编辑器(一)

    1.在linux中如果两个用户都在打开一个文件进行编辑,那么文件最后将以最后保存的版本为主. 2.vi仅仅是一个文本编辑器,相当于windows中的记事本,vi的工作模式, 命令模式:在该模式下,在键 ...

  7. linux初级学习笔记二:linux操作系统及常用命令,文件的创建与删除和命名规则,命令行展开以及linux中部分目录的作用!(视频序号:02_3)

    本节学习的命令:tree,mkdir,rmdir,touch,stat,rm 本节学习的技能:Linux中主要的目录作用以及特殊的目录文件: 文件的命名规则,命令行展开: 文件的创建与删除: Linu ...

  8. linux 中的进程wait()和waitpid函数,僵尸进程详解,以及利用这两个函数解决进程同步问题

    转载自:http://blog.sina.com.cn/s/blog_7776b9d3010144f9.html 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / wait ...

  9. linux环境中,两个不同网段的机器互通

    linux环境中,两个不同网段的机器互通   人评论3690人阅读2019-11-18 14:50:21   环境如下:   host1 单网卡 eth0 172.24.100.15/16   hos ...

随机推荐

  1. 洛谷——P1743 矩阵 III

    P1743 矩阵 III 题目背景 usqwedf 改编系列题. 题目描述 给定一个n*m的矩阵,问从左上角走到右下角有多少条路径. 输入输出格式 输入格式: 一行两个正整数 n,m 输出格式: 路径 ...

  2. 一个应用 可以有多个application

    韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com 一个应用里面怎样才能有2个application 一个AndroidManifest.xml中可 ...

  3. luogu P1012 拼数

    题目描述 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 又如:n=4时,4个整数7,13,4 ...

  4. 【高斯消元解xor方程】BZOJ1923-[Sdoi2010]外星千足虫

    [题目大意] 有n个数或为奇数或为偶数,现在进行m次操作,每次取出部分求和,告诉你这几次操作选取的数和它们和的奇偶性.如果通过这m次操作能得到所有数的奇偶性,则输出进行到第n次时即可求出答案:否则输出 ...

  5. 重拾vue1

    vue 一.认识Vue 定义:一个构建数据驱动的 web 界面的渐进式框架 优点: 1.可以完全通过客户端浏览器渲染页面,服务器端只提供数据 2.方便构建单页面应用程序(SPA) 二.引入Vue &l ...

  6. Nginx简单认识

    写在前面: 最近一直在学习,这几天了解了下Nginx,虽然看了些资料,斌哥也讲解了一下,但是貌似缺少了实践,就显得对其认识的不那么深刻.这里也还是简单的记录下把. 什么是Nginx? Nginx (e ...

  7. [bzoj1011](HNOI2008)遥远的行星(近似运算)

    Description 直 线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量, ...

  8. JS解决URL传递参数中文乱码问题

    function getUrlParam(name){ // 用该属性获取页面 URL 地址从问号 (?) 开始的 URL(查询部分) var url = window.location.search ...

  9. Notepad++前端开发常用插件介绍

    Notepad++前端开发常用插件介绍 Notepad++除了自身的功能强大之外,更是有许多非常的优秀的插件,下面就总结一下前端开发过程一些比较常用的插件. Emmet Emmet的前身是Zen Co ...

  10. mysql远程表/视图-应用

    Date :20140213Auth: Jin参考http://blog.sina.com.cn/s/blog_757b0e130101erl5.htmlhttp://dev.mysql.com/do ...