当前位置:  技术问答>linux和unix

(在线等)问个关于信号和进程的问题,有个程序哈!

    来源: 互联网  发布时间:2016-10-09

    本文导语:  #include  #include  #include  #include  static int alarm_fired=0; void ding(int sig) {         alarm_fired=1; } int main() {         pid_t pid;         pid=fork();         switch(pid)         {                 case -1:      ...



#include 
#include 
#include 
#include 
static int alarm_fired=0;
void ding(int sig)
{
        alarm_fired=1;
}
int main()
{
        pid_t pid;
        pid=fork();
        switch(pid)
        {
                case -1:
                        perror("fork failed");
                        exit(1);
                case 0:
                        sleep(5);
                        kill(getppid(),SIGALRM);
                        exit(0);
        }
        printf("waiting for alarm to go off n");
        (void)signal(SIGALRM,ding);
        pause();
        if(alarm_fired)
          printf("ding!n");
        printf("donen");
        exit(0);
}



这是linux程序设计那本书的一个源程序,我有点搞不清楚为什么要在子进程中传递SIGALRM信号给父进程。父进程不是也在执行么?自己捕捉不到这个信号么????

|
演示父子进程之间的一种通信技术吧
父进程没有调用alarm,自己不会产生SIGALRM信号

|

sleep(5);// 子进程等待父进程设置好信号处理函数
kill(getppid(),SIGALRM);// 给父进程发信号;

signal(SIGALRM,ding);// 父进程注册信号处理函数
pause();//父进程休眠,等待一个信号的来临

|

我觉得这个例子不太好。也许作者只是为了简化案例,强调用kill()可以进行某种程度的IPC。但这个例子本身,我觉得没有这么用的,它仅是个伪造的场景,在实际项目中不会这么用。

不好的理由如下:

不能假设调度算法,因此父子进程在fork()后,那个首先执行是不知道的。

sleep(5),5秒钟的挂起,是为了保证父进程能够首先执行。然而,这只是经验上的保证。从原理上说,在一个非常忙碌的机器上,有很多的进程情况下,5秒内父进程没有执行怎么办?

那么,kill()首先被执行,而父进程还没有调用signal()准备好处理SIGALRM。信号首先丢失。子进程变成僵尸。

之后,父进程运行,永远挂起在pause()。

现实中的关于信号的程序通常都比这个复杂的多。会引入sigprocmask() sigpending()等一系列函数来处理。LZ请留意!

    
 
 

您可能感兴趣的文章:

  • linux下system函数调用shell命令后,怎样让主进程不等子进程返回,接着执行(在线)?
  • 急急 solaris 系统被自己的进程调用太多堵死了,其它系统进程也运行不了,有没有什么好的办法啊?在线等!!!!
  • (在线等)精灵进程有什么作用??
  • 编程语言 iis7站长之家
  • 如何利用nice()改变进程的优先级啊,急,在线等
  • 关于守候进程的问题!在线等。。。
  • 在linux中用C如何获取进程列表和在线用户列表
  • 在线等待:怎样使一个进程挂起
  • (在线等)在shell中如何写一个if语句判断一个进程是否存在
  • xinetd 启动完毕后, 怎么把一个进程激活?(在线等)
  • 在线的解答openoffice能否开两个进程
  • Solaris上每个进程最大打开文件数的问题,急,在线等待
  • Linux进程管理的问题,急!在线等!
  • 在线等。。。使用压力测试工具进行测试有时出现httpd子进程CPU占用率100%,且压力撤除后无法恢复
  • fork()首次调用新创建进程时,其入口在哪里?在线等等
  • 用C编写一个多进程的程序,请各位大侠指点一下,不需要源代码,只想知道该怎样来设计程序的框架。在线等各位的帮助。谢谢。(急求)
  • 请问如何用C语言编写查找并杀死僵死进程的程序?在线等。。。。
  • 悬赏高分!分数决不平分!是linux下多进程跟信号问题!在线等!
  • 在线求助!关于如何使用“信号”的方式来响应键盘按下的消息!在线急盼回复!
  • 关于信号问题,在线等待
  • SIGPIPE信号中断问题?(急需,在线等)
  • linux服务器中,php页面中信号量锁住的问题,在线等
  • (在线等)消息队列,信号量和共享存储器之间各自有啥特殊功能?有啥共同点??
  • (在线等)关于信号的一个程序
  • linux 信号捕捉和处理的问题~~~在线等
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在哪里可以下载OREILLY的linux设备驱动程序一书的程序源代码?在线送分!
  • 我用的是putty软件SSH到linux上,但启动程序后关闭终端程序就退出了,在线等,请高人指教!
  • 7667在线代理程序
  • 急!急!!急!!!如何将键盘输入的字符读入程序中???---在线等待---
  • 重复调用另一个程序。------在线等!
  • 高分征集linux下程序在线升级方案!
  • 如何调用其他程序,比如说"notepad.exe",在线等待,急!
  • 如何在redhat e4下用gcc编译socket程序,(-lsocket无法使用啊)!急,在线等
  • perl运行程序如何取自身的文件名?------在线等
  • linux初学者一简单问题!在线送分!linux设备驱动程序一书的第一个程序.
  • 在线等,arm机上的程序找不到键盘?
  • 驱动程序的问题,急!!!(在线等!!!)
  • java应用程序的后期发布问题(在线等待)
  • 新手提问 在线等待,为什么我的程序中 new 操作符出错?
  • 关于在Linux下,运行程序的问题?请大家帮助小妹呀,在线等,谢谢!
  • 在线等:一个小问题,怎么让自己写的程序作为Linux系统的一个服务来运行?
  • 请问java应用程序怎样打开网页(在线等待)
  • 请问谁知道mydns服务程序在哪里可以下载到?(高分,在线等)
  • 有人有用JAVA读一个网页代码的程序吗?(在线等!)
  • 如何运行程序(在线等待)
  • 基于Html5的mockups在线工具简介
  • 装MYSQL后启动错误! mysqld ended --在线急等!在线急等!在线急等!在线急等!-----
  • MyEclipse SVN插件SubEclipse 在线离线等几种安装方式介绍
  • 智能在线表单设计器 FreeForm智能在线表单设计器
  • Linux使用群24032501,保持20人在线,目标50人在线
  • 简单的输入输出问题 在线等待 在线给分
  • 怎么用能让asp实现统计在线人数的功能。在线等待!!!帮忙送分!
  • 在线求教, 为什么不能开始除root之外的用户登录??...很急, 在线等
  • 在线等,在线给分!(简单问题,急)
  • 我需要唯一用户在线,不能两个用户同时在线的JSP实现的设计文档
  • 在线等,在线给分!!!!!!!!!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3