C 语言调用 signal(), kill() 函数疑问?

C、C++和Java语言
回复
foriany
帖子: 41
注册时间: 2007-06-22 11:55
送出感谢: 0
接收感谢: 0

C 语言调用 signal(), kill() 函数疑问?

#1

帖子 foriany » 2011-06-21 2:46

程序实现的是 主程序 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 次
头像
linjiework
帖子: 240
注册时间: 2009-07-07 19:52
送出感谢: 0
接收感谢: 0

Re: C 语言调用 signal(), kill() 函数疑问?

#2

帖子 linjiework » 2011-06-22 13:02

1. 不要随便使用和拦截SIGHUP信号。有专门给用户自己使用的两个信号。
2. 这个涉及进程同步的问题。也就是说在子进程执行 signal(SIGHUP,sighup); 语句之前,就收到了父进程发出的 SIGHUP 信号,然后就被杀死了。所以子进程永远无法进入 for 里面。
要解决这个问题,就需要采取进程同步操作,如果嫌麻烦,父进程 sleep 几秒就好了。
阿呆 : 天下第一呆!
回复

回到 “C/C++/Java”