Linux day7

守給你的承諾、 提交于 2020-02-16 19:38:20

信号

信号四要素:

  • 编号
  • 名称
  • 事件
  • 默认处理动作
    – 终止
    – 忽略
    – 终止+产生core
    – 暂停、继续

信号的特点:

  • 简单
  • 不能携带大量信息
  • 特定条件下产生

信号也叫软件产生的中断,有可能会有延迟
信号的处理方式:

  • 默认执行动作
  • 忽略
  • 捕捉

9,19号不能捕捉,不能忽略,甚至不能阻塞

系统api产生信号
kill函数
int kill(pid_t pid,int sig)

  • pid>0 ,要发送进程ID
  • pid=0,代表当前调用进程组内所有进程
  • pid=-1,代表有权限发送的所有进程
  • pid<0 ,代表 pid对应的组内所有进程
  • sig对应的信号

在这里插入图片描述

raise

给自己发信号
int raise(int sig);

时钟信号

alarm

  • 定时给自己发送SIGALRM
  • 几秒后发送信号
  • 返回值,上次闹钟剩余的描述
  • 特别的,如果传入参数秒为0,代表取消闹钟

setitimer函数

周期性的发送信号
struct itimerval{
struct timeval it_interval;/ * interval for periodic timer * / 周期性的时间设置
struct timeval it_value; / * Time until next expiration * /下次的闹钟事件

struct timeval{
time_t tv_sec; / * seconds * / 秒
suseconds_t tv_usec; / * microseconds * / 微秒
};

int setitimer(int which,const struct itimerval *new_value,struct itmerval *old_value);
which

  • ITIMER_REAL 自然定时法 SIGALARM
  • ITMER_VIRTUAL 计算进程执行时间 SIGVTALRM

在这里插入图片描述

在这里插入图片描述
信号集处理函数
清空信号集
int sigemptyset(sigset_t *set);
填充信号集
int sigfillset(sigset_t *set);

添加某个信号到信号集
int sigaddset(sigset_t *set,int signum);
从集合中删除某个信号
int sigdelset(sigset_t *set,int singnum);
是否为集合里的成员
int sigismumber(const sigset_t *set,int signum);

sigismumber()返回1代表signum在集合中

设置阻塞或者接触阻塞信号集
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

  • how
    –SIG_BLOCK设置阻塞
    –SIG_UNBLOCK接触阻塞
    –SIG_SETMASK设置set为新的阻塞信号集
  • set传入信号集
  • oldset旧的信号集,传出

获得未决信号机
int sigpending(sigset_t *set);

  • set传出参数,当前的未决信号集

打印未决信号集至屏幕

信号捕捉

防止进程意外死亡

typedef void(*sighandler_t)(int);
sighandler_t signal(int signum,sighandler_t handler);

  • signum 捕捉的信号
  • handler要执行的捕捉函数指针,函数应该声明void func(int);

struct sigaction {
void (*sa_handler)(int);//函数指针
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;//执行捕捉函数期间,临时屏蔽的信号集
int sa_flags;//一般填0,SA_SIGINFO会使用第二个函数指针
void (*sa_restorer)(void);//无序
};
注册捕捉函数
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
signum捕捉的信号
act传入的动作

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!