ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

系统编程-信号-信号发送kill、raise、alarm

2021-04-05 11:32:09  阅读:245  来源: 互联网

标签:raise alarm signo handler sig 信号 include signal


 

信号发送

 

kill 和 raise函数

kill函数参数详解:

 

 

实验1 raise和kill 的使用

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

//定义信号处理函数
//signo: 进程捕获到的信号
void sig_handler(int signo){
    printf("%d, %d occured \n", getpid(), signo);
    wait(NULL);
}

int main(void)
{
    pid_t pid;

    if(signal(SIGUSR1, sig_handler) == SIG_ERR){
        perror("signal error");
    }

    if(signal(SIGUSR2, sig_handler) == SIG_ERR){
        perror("signal error");
    }
    
    sleep(1);

    printf("向进程自己发送SIGUSR1 和 SIGUSR2 .\n");
    raise(SIGUSR1);
    kill(getpid(), SIGUSR2);

    while(1){
        sleep(1);
    }
}

编译运行:

结论1.1:raise(SIGUSR1) 等价于 kill(getpid(), SIGUSR2) 

结论1.2: 进程可以向自己发送信号

 

 

实验2 进程能够自杀吗? 

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

//定义信号处理函数
//signo: 进程捕获到的信号
void sig_handler(int signo){
    printf("%d, %d occured \n", getpid(), signo);
    wait(NULL);
}

int main(void)
{
    pid_t pid;

    if(signal(SIGUSR1, sig_handler) == SIG_ERR){
        perror("signal error");
    }

    if(signal(SIGUSR2, sig_handler) == SIG_ERR){
        perror("signal error");
    }

    sleep(1);

    printf("进程能够自杀吗?\n");
    raise(SIGKILL);

    while(1){
        sleep(1);
    }
}

编译运行:

结论: 进程可以通过发送9号信号杀死自己

 

 

定时器 alarm 和 ualarm

 

实验3 alarm使用

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

//定义信号处理函数
//signo: 进程捕获到的信号
void sig_handler(int signo){

    if(signo == SIGALRM){
	printf("clock time out \n");

	//需要重新设置定时器,使之成为一个周期性触发的定时器
    if(0 != alarm(5)){
	perror("alarm:5 error");
    }
    }
}

int main(void)
{
    pid_t pid;
    int cnt=0;

    if(signal(SIGALRM, sig_handler) == SIG_ERR){
        perror("signal error");
    }

    if(0 != alarm(5)){
	perror("alarm:5 error");
    }

    while(1){
	printf("main -- 1s -- \n");
        sleep(1);
	if((cnt++) == 13)
	    alarm(0);
	
    }

    return 0;
}

编译运行:

 

ualarm:微妙级别的定时器,精读比alarm高

 

 

 

 

.

标签:raise,alarm,signo,handler,sig,信号,include,signal
来源: https://www.cnblogs.com/happybirthdaytoyou/p/14617425.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有