[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > 其它 > 正文
Linux程式設計- 3.signals
http://www.openchess.org/noitatsko/programming/ (2001-05-24 16:47:48)
信號處理

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

信號處理概說 
送出信號 
接收信號 
信號的處理 
任務控制 

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

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 

(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
Linux程式設計-31.工作群資訊管理(grp) (2001-05-27 22:08:00)
Linux程式設計-30.使用者資訊管理(pwd) (2001-05-27 21:04:00)
Linux程式設計-29.時間處理 (2001-05-27 20:10:01)
Linux程式設計-28.GNU Make (2001-05-27 19:00:00)
Linux程式設計-27.GNU Debugger (2001-05-27 18:08:01)
Linux程式設計-26.PIPE (2001-05-27 17:04:00)
Linux程式設計-25.Message Queues (2001-05-27 16:10:00)
Linux程式設計-24.Semaphores (2001-05-27 15:00:00)
Linux程式設計-23.共享記憶體(Shared Memory) (2001-05-27 14:08:00)
Linux程式設計-20.getopt (2001-05-27 13:04:00)

===更多相關===
 

★  樊強制作 歡迎分享  ★