当前位置--> 首 页 --> 文 章 -->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 人次查阅) |