zoukankan      html  css  js  c++  java
  • Linux—信号(day09)

    目录

    一、使用C程序访问环境变量

    二、文件输入重定向

    三、管道

    四、信号


    四、信号

      信号就是软件模拟的中断,信号是进程的异步通讯机制。

      如何查看系统提供的信号:kill -l,下面的数字为信号的编号,编号后面的字符为信号的名称。

    man 7 signal,可查看信号帮助

     通过shell向进程发送信号,kill -信号编号 pid

      总的来说,信号有以下几个过程:信号的产生,可能有信号阻塞、信号未决(信号传输这一段时间)、进程捕获信号,信号处理

      进程对信号的默认处理动作就是会终止当前进程,用户可以根据自己的需求来设置对信号的处理。主要有以下:

      SIG_DEL(缺省的,默认处理状态)、SIG_IGN(忽略信号)、用户自定义信号处理函数


    信号处理:

      如需使用自定义函数,则需要向进程注册一个函数,当信号到来的时候,使用注册的信号处理函数来处理到达的信号。注册函数使用signal(2)

    #include <signal.h>
    typedef void (*sighandler)(int); sighandler signal(int signum,sighandler handler);
    功能:
      为信号注册处理函数
    参数:
      signum:信号的名字或编号
      handler:
        SIG_DEL:默认
        SIF_IGN:忽略
        用户自定义的信号处理函数
    返回值:
      错误:SIG_ERR
      成功:返回注册前的信号处理函数 

    1、默认处理情况
      直接在主函数中写一个死循环,再向进程发送信号,进程就会终止
    2、忽略处理
    #include<stdio.h>
    #include<signal.h>
    int main(void){ 
    signal(
    2,SIG_IGN);
    while(1);

    return 0;
    }

    3、自定义处理

    #include<stdio.h>
    #include<signal.h>
    void doit(int n){
        printf("recv signal...
    ");
        return;
    }
    int main(void){ 
        signal(2,SIG_IGN);
        signal(3,doit);
        while(1); 
       
        return 0; 
    }

    信号的产生:

    1、硬件产生信号
     ctrl+c、ctrl+等
    2、使用linux命令
     kill -信号编号 pid
    3、使用函数发送信号
    kill(2)
    #include<sys/types.h>
    #include<signal.h>
    int kill(pid_t pid,int sig);
    功能:
      发送一个信号给一个进程或进程组
    参数:
      pid:
        如果pid为正,则为指定pid进程发送信号
        如果pid为0,则为进程组的每一个进程都发送信号
        如果为-1,发送给所有与发送信号进程有相同权限的进程(init除外)
        如果pid比-1还小,那么sig就被发送给id是-pid的所有进程
      sig:
        0,不发送信号,但是仍然检测错误,可以用来检测PID或者PPID是否存在
        非0:指定信号编号
    返回值:
       成功:0
       错误:-1,errno被设置 

    信号接收处理程序
    #include<stdio.h>
    #include<signal.h>
    void doit(int n){
        printf("recv signum%d
    ",n);
        return;
    }
    int main(void){ 
        printf("pid%d
    ",getpid());
        signal(2,doit);
        while(1); 
        return 0; 
    }

    信号发送程序

    #include<stdio.h>
    #include<signal.h>
    #include<sys/types.h>
    
    int main(int argc,char *argv[]){
        //通过可执行程序名+ 信号编号+pid发送信号
        int signum=atoi(argv[1]);
        pid_t pid=atoi(argv[2]);
        kill(pid,signum);
        return 0;
    }

    raise(3)

    #include<signal.h>
    int raise(int sig);
    功能:
      发送一个信号给调用者
    参数:
      sig:要发送的信号编号
    返回值:
      成功:0
      失败:非0

    使用raise给自己发送信号:
    #include<stdio.h>
    #include<signal.h>
    void doit(int n){
        printf("recv signum%d
    ",n);
        return;
    }
    int main(void){ 
        printf("pid%d
    ",getpid());
        signal(2,doit);
        while(1){
            sleep(2);
            raise(2);
        }
        return 0; 
    }
    
    

    alarm(2)

    #include<unistd.h>

    unsigned int alarm(unsigned int seconds);

    功能;

      设置一个传递信号的闹钟

    参数:

      seconds:设置闹钟秒数

    返回值:

      保留的秒数;参数seconds为0时,之前设置的定时器闹钟将被取消,并将剩下的时间返回

    
    
    #include<stdio.h>
    #include<unistd.h>
    int main(void){
        int i;
        alarm(1)
        for(i=0;;i++){
            printf("%d
    ",i);
        }  
        return 0;
    }
    
    
    
     
  • 相关阅读:
    SQL Server 造成cpu 使用率高的 6 原因
    SQL Server SQLOS
    flask数据库操作
    redis数据类型
    python3中__get__,__getattr__,__getattribute__的区别
    强弱类型,动静态语言
    函数式编程和面向对象编程
    数据库事务的四个特性和含义
    流畅的python
    Python中__repr__和__str__区别
  • 原文地址:https://www.cnblogs.com/ptfe/p/11017522.html
Copyright © 2011-2022 走看看