在进行堵塞式系统调用时为避免进程陷入无限期的等待,能够为这些堵塞式系统调用设置定时器linux下有哪些信号提供了alarm系统调用和SIGALRM信号实现这个功能。
SIGALRM信号成功安装后在什么情况下进程会收到该信号呢?这就要依赖于linux下有哪些信号提供的定时器功能在linux下有哪些信号系统下,每一个进程都有惟一的一個定时器该定时器提供了以秒为单位的定时功能。在定时器设置的超时时间到达后调用alarm的进程将收到SIGALRM信号。
alarm系统调用的原型为:
1)seconds:偠设定的定时时间以秒为单位。在alarm调用成功后開始计时超过该时间将触发SIGALRM信号。
例8-10:编程利用SIGALRM信号实现秒定时器
//又一次启动定时器,实现1秒定时
//关闭标准输出的行缓存模式
//进程进入无限循环仅仅能手动终止
在linux下有哪些信号的多进程编程中,SIGCLD是一个很重要的信号当┅个子进程退出时。并非马上释放其占用的资源而是通知其父进程,由父进程进行兴许的工作
在这一过程中,系统将依次产生下列事件
1)向父进程发送SIGCLD信号,子进程进入zombie(僵尸)状态
2)父进程接收到SIGCLD信号,进行处理
假设在上述过程中父进程既没有忽略SIGCLD信号。也未捕获该信号进行处理则子进程将进入僵尸状态。僵尸状态的进程不能被操作系统调用也没有不论什么可执行代码,它只是是占用了进程列表中的一个位置而已
假设仅有几个僵尸进程不会影响系统的执行,可是假设僵尸进程过多则将会严重影响系统的执行。因此在編程过程中应避免产生僵尸进程。有两种主要的处理方法能够避免产生僵尸进程:一是父进程忽略SIGCLD信号;二是父进程捕获SIGCLD信号在信号处悝函数中获取子进程的退出状态。忽略信号的方式比較简单仅仅须要调用signal(SIGCLD,SIG_IGN)语句就可以完毕。假设要捕获信号并处理那么先要安装SIGCLD信号,然后在信号处理函数中调用wait或者waitpid等函数获取子进程的退出状态
//保存退出进程的ID
//保存退出进程的退出状态码
//等待不论什么一个子进程退出
//输出退出的子进程ID和退出代码
//退出子进程,退出状态码为0