信号

信号

简单信息,类似于中断 ,软中断,异步处理。

信号产生的方式:
1、按键产生的信号:Ctrl+c 中断 ctrl +\ Ctrl+z 切换到后台运行
2、系统调用: kill alarm
3、命令:kill
4、硬件:总线错误 段错误
5、软件:sleep
递达:成功发送信号
未决:

信号:
1、默认的处理方式
2、忽略
3、捕捉(自定义处理)

信号四个要素:
信号名字 编号 行为 默认的处理方式

相关系统调用

alarm 定时器 每个进程只有一个定时器
alarm(5)--3s--alarm(10)---5s---alarm(0)(结束定时器)
练习:1s 中打印多少行。

#include <stdio.h>
#include <unistd.h>
int main(){
    alarm(1);
    int i = 1;
    while(i++){
        printf("hello:%d\n",i);
    }
}
kill

1、kill命令结束进程
了解进程组概念,(默认进程组ID同父进程)
kill -9 进程ID (-9表示信号为SIGKILL的编号 ) :杀死进程
kill -9 -进程ID :杀死进程组。
2、kill函数结束进程。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void exit(int);
void sys_err(const char *str)
{   
    perror(str);
    exit(1);
}

int main(){
    pid_t pid_ret = fork();
    if(-1 == pid_ret)sys_err("fork Err");
    if(0 == pid_ret){
    
        printf("child:%d:%d:%d\n",getpid(),getppid(),getpgid(0));
        sleep(2);
    }
    if(pid_ret>0){
        printf("parent:%d:%d:%d\n",getpid(),getppid(),getpgid(0));
        printf("child pid :%d\n",pid_ret);
        
        if(kill(pid_ret,SIGKILL)==0){printf("kill success");};
    }   
}
捕捉

signal :注册信号处理捕捉函数(类似于 备案)

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <pthread.h>//头文件千万别忘le

void exit(int);
void sys_err(const char *str)
{   
    perror(str);
    exit(1);
}

void func(int a){
    printf("***signal:%d\n***",a);
    return; 
}
int main(){
        signal(SIGINT,func);
        //struct sigaction act;
        //act.sa_handler = func;
        //sigemptyset(&(act.sa_mask));
        //act.sa_flags = 0;
        //sigaction(2, &act,NULL);
        while(1){
        printf("hello\n");
        sleep(5);}
        return 0;
}
利用捕捉信号回收子进程
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <pthread.h>//头文件千万别忘le
#include <sys/wait.h>

void exit(int);
void sys_err(const char *str)
{   
    perror(str);
    exit(1);
}

void func(int a){
    printf("signo=%d:waitpid=%d\n",a,wait(NULL));   
    return; 
}
int main(){
        int i=0;
        for(;i<5;i++){
            pid_t pid_ret = fork();
            if(pid_ret == 0)
            {
                break;
            }
        }
        
        if(5 == i){
            struct sigaction act;
            act.sa_handler = func;
            sigemptyset(&(act.sa_mask));
            act.sa_flags = 0;
            sigaction(SIGCHLD, &act,NULL);
            printf("parent\n");
            while(1);
        }
        else{
            printf("child:%d\n",getpid());
        }

        return 0;
}

2020/3/10 补充


发送信号的函数
  1、kill
  2、raise 自己给自己发  
  3、abort 自己给自己发+终止信号  abort()无参数
  4、alarm 有且只有一个
        发送的信号就是 SIGALRM   终止进程
        返回值:
           成功:如果调用此alarm()前,进程中已经设置了闹钟时间,      
          则返回上一个闹钟时间的剩余时间,否则返回0。

          time 可以统计当前进程运行的时间

          alarm(0)取消闹钟
5、setitimer 定时器  精度微妙  可以实现周期定时(了解)




信号捕捉

1、signal

                //回调函数
        void sig_fun(int num)
        {
            ;
        }
        signal(SIGINT,sig_fun);

//注意:
注册SIGINT信号的捕捉函数,内核会帮助我们调用sig_fun函数

2、sigaction函数 ----待补充

 #include <signal.h>
int sigaction(int signum, const struct sigaction *act,
                     struct sigaction *oldact);

SIG_DFL:默认信号处理程序
SIG_IGN:忽略信号的处理程序

signal(SIGTERM,SIG_IGN);//忽略信号kill PID
signal(SIGTSTP,SIG_DFL);//ctrl + z 执行默认操作

SIGCHLD
SIGCHLD信号,在子进程结束的时候,默认会给父进程发送一个SIGCHLD信号

发送信号
signal(SIGCHLD,sig_fun);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 一、信号及信号来源 信号本质 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一...
    丶Em1tu0F阅读 1,423评论 0 1
  • 进程之间可以通过信号传递信息,信号是一种软中断机制,通过信号用来通知进程发生了异步事件。进程之间可以互相通过系统调...
    lintong阅读 407评论 0 2
  • 使用场景:1、为了并发,中断处理其它事件,1、进程间通信1、中断中止(注意不是终止)当前正在执行的程序,转而执行其...
    奥斯特洛司机阅读 683评论 0 0
  • 2016-02-15 信号 信号概念 每个信号都有一个名字,这些名字都以三个字符SIG开头。eg SIGABRT ...
    千里山南阅读 1,120评论 0 0
  • 上海 地理课本上的描述气候是亚热带季风气候 ,来到上海 不凉不热 ,感觉好的,上海的老建筑 老品牌 凤凰黄金完美...
    嗨皮呦阅读 73评论 0 1