alarm kill raise 函数

本文通过C语言实现信号处理实验,展示了如何使用信号系统(如SIGHUP和SIGALRM)进行进程控制,并通过调用kill、alarm和raise函数演示了不同信号的触发和响应过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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);
            }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值