2.20-22kill、raise、abort、alarm、settimer函数

本文详细介绍了Linux系统中用于进程控制的kill、raise、abort函数,以及定时器相关函数alarm和setitimer的工作原理和使用示例。kill函数用于向指定进程发送信号,raise函数用于向当前进程发送信号,abort函数则会发送SIGABRT信号结束当前进程。同时,文章还探讨了alarm函数如何设置定时器并在时间到时发送SIGALRM信号,以及setitimer函数的高精度定时和周期性定时功能。

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

kill、raise、abort函数:

/*
    #include <sys/types.h>
    #include <signal.h>
    int kill(pid_t pid, int sig);
        -功能:给任何的进程或者进程组pid,发送某个信号任何的信号 sig
        -参数:
            -pid:需要发送给的进程的id
                >0 : 将信号发送给指定的进程
                =0 : 将信号发送给当前的进程组
                =-1 : 将信号发送给每一个有权限接收这个信号的进程
                <-1 : 这个pid=某个进程组的id取反(-12345表示给12345进程组发送信号)
            -sig:需要发送的信号的编号或者宏值(建议使用宏值因为不同的架构编号可能不同),0表示不发送任何信号
        kill(getppid(),9);
        kill(getpid(),9);
    
    #include <signal.h>
    int raise(int sig);
        -功能:给当前的进程发送信号
        -参数
            -sig:要发送的信号
        -返回值:
            成功 0
            失败 非0
    kill(getpid(),sig);
    
    #include <signal.h>
    void abort(void);
        功能:发送SIGABRT信号给当前进程,杀死当前进程
    kill(getpid(),SIGABRT);
*/
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>

int main(){

    pid_t pid = fork();
    if(pid==0){
        //子进程
        int i = 0;
        for(i=0;i<5;i++){
            printf("child process\n");
            sleep(1);
        }
    }
    else if(pid>0){
        //父进程
        printf("parent process\n");
        sleep(2);
        printf("kill child process now\n");
        kill(pid,SIGINT);
    }
    return 0;
}

alarm函数:

/*
    #include <unistd.h>
    unsigned int alarm(unsigned int seconds);
        功能:设置定时器(闹钟)。函数调用开始倒计时,当倒计时为0的时候
            函数会给当前的进程发送一个信号:SIGALARM
        参数:
            seconds:倒计时的时长,单位:秒。如果参数为0,定时器无效(不进行倒计时,不发送信号)
                取消一个定时器,通过alarm(0)
        返回值:
            之前没有定时器返回0
            之前有定时器,返回之前定时剩余的倒计时剩余的时间

    SIGALARM:默认终止当前的进程,每一个进程都有且只有唯一的一个定时器
        alarm(10); ->返回0
        过了1s
        alarm(5);//覆盖了之前的 ->返回9
    
    alarm(100) -> 该函数是不阻塞的

*/
/*
    实际的时间 = 内核时间 + 用户时间 + 消耗的时间(指用户态到内核态切换的时间)
    进行文件io操作的时候比较浪费时间
    
    定时器,与进程的状态无关(自然定时法)。无论进程处于什么状态,alarm都会计时
*/
#include <stdio.h>
#include <unistd.h>
int main(){
    int seconds=alarm(5);
    printf("seconds = %d\n",seconds);//返回0
    
    sleep(2);

    seconds=alarm(2);//不阻塞
    printf("seconds = %d\n",seconds);//3
    
    while(1){

    }
    return 0;
}

setitimer函数:

/*
    #include <sys/time.h>

    int setitimer(int which, const struct itimerval *new_value,
                     struct itimerval *old_value);
        功能:设置定时器(闹钟),可以替代alarm函数。精度us,可以实现周期性的定时
        参数:
            which:定时器以什么时间计时
                ITIMER_REAL:真实时间,时间到达,发送SIGALRM 常用
                ITIMER_VIRTUAL:用户时间,时间到达,发送SIGVTALRM
                ITIMER_PROF:以该进程在用户态和内核态下所消耗的时间来计时,时间到达,发送SIGPROF

            new_value:设置定时器的属性

            struct itimerval {//定时器的结构体
               struct timeval it_interval; //每个阶段的时间,间隔时间
               struct timeval it_value;    //延迟多长时间执行定时器
            };

            struct timeval {//时间的结构体
               time_t      tv_sec;  //秒数
               suseconds_t tv_usec; //微秒
            };

            过10s后每隔2s定时一次

            old_value:记录上一次的定时的时间参数可以在这里获取到,用不到的话传递一个NULL
        
        返回值:
            成功 0
            失败 -1 指定错误号

*/
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
//过3s后每隔2s定时一次
int main(){
    struct itimerval new_value;
    //设置值
    new_value.it_interval.tv_sec=2;//设置间隔的时间
    new_value.it_interval.tv_usec=0;

    //设置延迟的时间,3s后开始第一次定时
    new_value.it_value.tv_sec=3;//s
    new_value.it_value.tv_usec=0;//us
    int ret=setitimer(ITIMER_REAL,&new_value,NULL); //非阻塞的
    printf("定时器开始了...\n");
    if(ret==-1){
        perror("setitimer");
        exit(0);
    }

    getchar();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值