zoukankan      html  css  js  c++  java
  • linux get_opt sigpause

    1. linux 处理命令行程序时,对输入的参数处理,可以使用get_opt 库函数,方便制作命令行工具。

    2. linux信号:

      信号是由用户,系统或者进程发送给目标进程的信息,用来通知目标进程的某个状态的改变或者或者系统异常。

    发送信号: 

    
    
    #include <sys/types.h>
    #include <signal.h>
    int kill (pid_t pid, int sig);
    
    

    pid 代表目标进程的pid, sig代表要发送的信号。 pid的不同取值,可以实现向多个进程发送信号。

    pid >0 信号发送给进程号为pid的进程

    pid = 0 信号发送给本进程组内的其他进程

    pid = -1 信号发送给除init外的其他所有进程

    pid < -1 信号发送给ID为 -pid的进程组的所有进程

    信号处理:

    目标进程收到信号后,需要定义一个信号处理函数来处理信号 。

    1. signal系统调用

    #include<signal.h>
    _sighandler_t signal(int sig, _sighandler_t _handler);

    typedef void(*__sighandler_t) (int);

    sig指示要捕获的信号类型,_handler是一个函数指针,用于指定信号处理函数。

    2.sigaction

    #include<signal.h>
    int sigaction(int sig, struct sigaction* act, struct signation* oact);

    sig 指示处理的信号类型,act指示信号的处理方式,oact 若不为NULL, 则输出信号先前的处理方式。  

    sigaction 是一个结构体,其定义如下:

       struct sigaction {
                   void     (*sa_handler)(int);
                   void     (*sa_sigaction)(int, siginfo_t *, void *);
                   sigset_t   sa_mask;
                   int        sa_flags;
                   void     (*sa_restorer)(void);
               };

    有些定义把 sa_handler 和sa_sigaction 定义为一个结构体, 避免其被同时注册,即在使用的时候,我们只需向其中的一个注册信号处理函数即可。

    sa_mask 是进程的信号掩码。每个进程都有一个信号掩码,信号掩码是一个“位图”,如果位图中某位标识1,表示该位对应的信号被暂时屏蔽。如果标识为0,表示进程可以接收这个信号。信号的暂时屏蔽和信号的忽略并不等同,信号的暂时屏蔽是指,信号到来时,由于进程将该信号阻塞,所以操作系统并不将该信号传递出去,直到对应的进程解除阻塞,儿信号的忽略则是信号被传递,但是进程忽略了该信号。

    3.sigprocmask

    #include <signal.h>  
      
    int sigprocmask(ubt how,const sigset_t*set,sigset_t *oldset);  
      
    int sigsuspend(const sigset_t*sigmask);  

    该函数用来改变当前进程的信号屏蔽集。其具体的使用方法这里不再赘述。

    4.sigsuspend函数

    sigsuspend的整个原子操作过程为:
    (1) 设置新的mask阻塞当前进程;
    (2) 收到信号,恢复原先mask;
    (3) 调用该进程设置的信号处理函数;
    (4) 待信号处理函数返回后,sigsuspend返回。

    贴两张网上看到的图,解释sigsuspend 和pause的区别。

    ~~~~~
  • 相关阅读:
    Linux网络相关命令firewalld和netfilter、iptables 使用(6/22)
    Linux时间设置与iptables命令
    负载均衡集群ipvsadm命令及基本用法
    LVS原理详解以及部署
    linux比较两个文件的不同(6/21)
    如何使用sql函数平均值、总数、最小值、最大值
    python中数据类型转换
    使用 getopt 处理命令行长参数
    Mysql常用命令行大全
    C#控制台程序使用Log4net日志组件
  • 原文地址:https://www.cnblogs.com/missmzt/p/sigpause.html
Copyright © 2011-2022 走看看