信號處理
--------------------------------------------------------------------------------
信號處理概說
送出信號
接收信號
信號的處理
任務控制
--------------------------------------------------------------------------------
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論壇】
|