当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : C 语言调用 signal(), kill() 函数疑问?
帖子发表于 : 2011-06-21 2:46 

注册: 2007-06-22 11:55
帖子: 41
送出感谢: 0 次
接收感谢: 0 次
程序实现的是 主程序 fork() 成父进程和子进程, 父进程通过 kill() 发送信号 到 子进程, 子进程根据收到的信号做出相应的反应,
现在问题是只有在 else 语句中注释掉 kill(pid,SIGHUP) 后, 子进程中的
signal(SIGINT,sigint);
signal(SIGQUIT, sigquit);
才会执行, 如果 不注释掉 第一个 kill(pid,SIGHUP) 语句的话, 子进程根本就不执行, 即 if 中语句根本不执行
附源代码和源代码附件

代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void sighup(); /* routines child will call upon sigtrap */
void sigint();
void sigquit();

int main()
{ int pid;

  /* get child process */
 
   pid=fork();
   printf("The process id is %d and return value is %d\n", getpid(), pid);
   if (pid == 0)
     { /* child */
       signal(SIGHUP,sighup); /* set function calls */
       signal(SIGINT,sigint);
       signal(SIGQUIT, sigquit);
       for(;;); /* loop for ever */
     }
  else /* parent */
     {  /* pid hold id of child */
       printf("\nPARENT: sending SIGHUP, pid=%d\n\n",pid);
 //   kill(pid,SIGHUP);
       sleep(3); /* pause for 3 secs */
       printf("\nPARENT: sending SIGINT, pid=%d\n\n",pid);
      kill(pid,SIGINT);
       sleep(3); /* pause for 3 secs */
       printf("\nPARENT: sending SIGQUIT, pid=%d\n\n",pid);
      kill(pid,SIGQUIT);
       sleep(3);
     }
     return 0;
}

void sighup()

{  signal(SIGHUP,sighup); /* reset signal */
   printf("CHILD: I have received a SIGHUP\n");
}

void sigint()

{  signal(SIGINT,sigint); /* reset signal */
   printf("CHILD: I have received a SIGINT\n");
}

void sigquit()

{ printf("My DADDY has Killed me!!!\n");
  exit(0);
}


附件:
文件注释: 进程间的信号传递实现
sig_talk.c [2.44 KiB]
被下载 12 次
页首
 用户资料  
 
2 楼 
 文章标题 : Re: C 语言调用 signal(), kill() 函数疑问?
帖子发表于 : 2011-06-22 13:02 
头像

注册: 2009-07-07 19:52
帖子: 240
送出感谢: 0 次
接收感谢: 0 次
1. 不要随便使用和拦截SIGHUP信号。有专门给用户自己使用的两个信号。
2. 这个涉及进程同步的问题。也就是说在子进程执行 signal(SIGHUP,sighup); 语句之前,就收到了父进程发出的 SIGHUP 信号,然后就被杀死了。所以子进程永远无法进入 for 里面。
要解决这个问题,就需要采取进程同步操作,如果嫌麻烦,父进程 sleep 几秒就好了。


_________________
阿呆 : 天下第一呆!


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译