当前位置--> 首 页 --> 文 章 -->Linux Develop

※阅读文章※

Linux程式设计- 3.signals


作者:不祥 [文章出自: www.fanqiang.com]

信号处理

--------------------------------------------------------------------------------

信号处理概说 
送出信号 
接收信号 
信号的处理 
任务控制 

--------------------------------------------------------------------------------

POSIX IPC 
reliable/unreliable 
reentrant 
pending 
sending signals 
catching signals 
manipulating 
signal definitions 

--------------------------------------------------------------------------------

信号singals
信号的处理可以用一大章来写,涉及的层面也会深入整个作业系统中,我并不打算这样做,因为您可能会越搞越迷糊。这里我只告诉您如何接上信号,在实用的层面上,这样便很够用了。您可以先利用这些基本的技巧来撰写程式,等到有进一步高等应用的需要时,找一本较深入的UNIX Programming教材,专门研究signal的写法。 
一般简单的signal写法如下: 

void mysignal(int signo) 

  /* my signal handler */ 


void initsignal(void) 

  struct sigaction act; 

  act.sa_handler = mysignal; 
  act.sa_flags   = 0; 
  sigemptyset(&act.sa_mask); 
  sigaction(SIGHUP,&act,NULL); 
  sigaction(SIGINT,&act,NULL); 
  sigaction(SIGQUIT,&act,NULL); 
  sigaction(SIGILL,&act,NULL); 
  sigaction(SIGTERM,&act,NULL); 

  

例一: lock.c
在fork的例三中提到,在daemon被杀掉时,需要在离开前,将/var/run/lock.pid删除。这里我们可以利用signal来处理这件事。 
#include  
#include  
#include  
#include  

#define LOCK_FILE "/var/run/lock.pid" 

void quit(int signo) 

  printf("Receive signal %d\n",signo); 
  unlink(LOCK_FILE); 
  exit(1); 


void main(void) 

  FILE *fp; 
  pid_t pid; 
  struct sigaction act; 

  if (access(LOCK_FILE,R_OK)==0) { 
    printf("Existing a copy of this daemon!\n"); 
    exit(1); 
  } 

  pid = fork(); 

  if (pid>0) { 
    printf("daemon on duty!\n"); 

    fp = fopen(LOCK_FILE,"wt"); 
    fprintf(fp,"%d",pid); 
    fclose(fp); 
  } else 
    exit(0);  if (pid<0) { 
    printf("Can't fork!\n"); 
    exit(-1); 
  } 

  act.sa_handler = quit; 
  act.sa_flags   = 0; 
  sigemptyset(&act.sa_mask); 
  sigaction(SIGTERM,&act,NULL); 
  sigaction(SIGHUP,&act,NULL); 
  sigaction(SIGINT,&act,NULL); 
  sigaction(SIGQUIT,&act,NULL); 
  sigaction(SIGUSR1,&act,NULL); 
  sigaction(SIGUSR2,&act,NULL); 

  for (;;) { 
    sleep(3); 
  } 


编译:
gcc -o ex1 lock.c 
执行
./ex1 
daemon on duty! 

送信号
我们先找出该守护神程式的pid 
PID=`cat /var/run/lock.pid` 

接下来利用kill来送信号 

kill $PID 

Receive signal 15 

程式将会结束,并且/var/run/lock.pid将会被删除掉,以便下一次daemon再启动。注意到如果quit函数内,没有放exit(),程式将永远杀不掉。 

接下来送一些其它的信号试试看。 
./ex1 
PID=`cat /var/run/lock.pid` 
kill -HUP $PID 

Receive signal 1 

您可以自行试试 
kill -INT $PID 
kill -QUIT $PID 
kill -ILL $PID 



等等这些信号,看看他们的结果如何。 

信号的定义
在/usr/include/signum.h中有各种信号的定义 
#define SIGHUP          1 &nb 


文章加入时间: 2004-11-17 14:56:32 责任编辑: w9   (3585 人次查阅)
 
Copyright © 1998-2004 中国PHP联盟 All rights reserved.