#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "apue.h"
#include <errno.h>
#include <signal.h>
static void sig_kill(int signo)
{
printf("Received from kill().\n");
}
static void sig_alarm(int signo)
{
printf("Receiver form aralm().\n");
}
int main()
{
signal(SIGHUP,sig_kill); /*进程用自定义函数来捕获SIGHUP和SIGALRM信号,不是采用系统的默认方式.对于SIGHUP和SIGALRM信号,系统的默认动作都是
终止接收信号的进程. */
signal(SIGALRM,sig_alarm);
printf("kill() is called.\n");
kill(getpid(),SIGHUP);
printf("alarm() is called.\n");
alarm(3);
printf("pause() is called.\n");
pause();
printf("raise() is called.\n");
raise(SIGHUP);
exit(0);
}
输出结果:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "apue.h"
#include <errno.h>
#include <signal.h>
static void sig_kill(int signo)
{
printf("Received from kill().\n");
}
static void sig_alarm(int signo)
{
printf("Receiver form aralm().\n");
}
int main()
{
// signal(SIGHUP,sig_kill);
// signal(SIGALRM,sig_alarm);
printf("kill() is called.\n");
kill(getpid(),SIGHUP);
/* printf("alarm() is called.\n");
alarm(3);
printf("pause() is called.\n");
pause();
printf("raise() is called.\n");
raise(SIGHUP);
exit(0);*/
}
由于signal(SIGHUP,sig_kill) 被注销了,所以调用kill函数时,系统对SIGHUP信号的默认处理是终止收到该信号的进程。得到的结果是:
如果代码改成这样:alarm也称为闹钟函数,它可以在进程中设置一个定时器,当定时器指定的时间到时,它向进程发送SIGALRM信号。如果忽略或者不捕获此信号,则其默认动作是终止调用该alarm函数的进程
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "apue.h"
#include <errno.h>
#include <signal.h>
static void sig_kill(int signo)
{
printf("Received from kill().\n");
}
static void sig_alarm(int signo)
{
printf("Receiver form aralm().\n");
}
int main()
{
// signal(SIGHUP,sig_kill);
// signal(SIGALRM,sig_alarm);
/* printf("kill() is called.\n");
kill(getpid(),SIGHUP);*/
printf("alarm() is called.\n");
alarm(1);
printf("pause() is called.\n");
sleep(10);
pause();
printf("raise() is called.\n");
raise(SIGHUP);
exit(0);
}
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
void sig_alarm(int signo){
printf("Alarming.\n");
signal(SIGALRM, sig_alarm); //让内核做好准备,一旦接受到SIGALARM信号,就执行sig_alarm
/* 如果将signal(SIGALRM, sig_alarm); 注释掉,那么程序运行的结果是一样的,由此可以推测出这句话是向内核注册了sig_alarm 函数,当内核接受到
SIGALRM时,内核执行sig_alarm函数。只需在主函数中定义一下,内核获得即可
*/
alarm(5);
}
int main(){
int i;
signal(SIGALRM, sig_alarm);//让内核做好准备,一旦接受到SIGALARM信号,就执行sig_alarm
alarm(5);
/* 如果 将alarm(5) 和 signal(SIGALRM, sig_alarm);的 位置互换,对结果毫无影响*/
for(i=1;i<21;i++){
printf("sleep %d ...\n",i);
sleep(1);
}
}