UNIX C 信号

Posted Kernel001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UNIX C 信号相关的知识,希望对你有一定的参考价值。

1.信号处理

#include <signal.h>

typedef void(*sighander_t)(int);

sighander_t signal(int signum,sighander_t hander)
成功返回原信号处理方式,失败返回SIGERR

--signum :信号编号
--hander: 信号处理方式
    SIG_IGN:忽略信号
    SIG_DFL:默认操作
    信号处理函数指针 -捕获信号

 

2.信号处理函数

void sighander(int signum)
{
   信号处理代码;     
}

 

3.调用函数发送信号

  杀死进程信号

#include <signal.h>

int kill (pid_t pid,int signum);
    
  成功发送信号并返回0,失败-1

  

  向调用进程发送信号

#include <signal.h>

int raise(int signum);

raise函数是向调用进程发送信号
对单线程程序来说,相当于
    kill(getpid,signum);
对多线程程序来说,相当于
    pthread_kill(pthread_self,signum);

 

4.暂停

#include <unistd.h>

int pause(void);
该函数无时限睡眠,只到收到信号发生,改变自身状态
成功阻塞,失败-1;

 

5.睡眠

  sleep(seconds)  

#include <unistd.h>

unsigned int sleep(unsigned int seconds);

返回0或剩余秒数

该函数调用进(线)程睡眠seconds秒,除非信号打破这种状态

  

  usleep

#include <unistd.h>

 int usleep(usecond_t usec);

--usec 微秒
成功返回0,失败 -1

 

6.闹钟

  alarm

#include <unistd.h>

unsigned int alarm(unsigned int  seconds);

返回剩余秒数

 

 7.信号集

  填满信号集

#include <signal.h>

int sigfillset(sigset_t* sigset);

--sigset :信号集

  

  清空信号集

#include <signal.h>

int sigemptyset(sigset_t* sigset);

成功0,失败-1

  

  加入信号

#include <signal.h>

int sigaddset(sigset_t* sigset,int signum);

成功0,失败-1

--sigset :信号集
--signum:信号编号

 

  

  删除信号

#include <signal.h>

int sigdelete(sigset_t* sigset,int signum);

成功0,失败-1

 

  

  判断信号是否在信号集中

#include <signal.h>

sigismember(const sigset_t* sigset,int signum);

有返回1,没有0,失败-1

 

 

 8.信号屏蔽

  信号掩码

#include <signal.h>

int sigprocmask(int  how,const sigest_t* sigset,sigset_t* oldsigset);

--how有一下取值
SIG_BLOCK  将sigset信号加入当前信号掩码
SIG_UNBLOCK 从当前信号掩码中删除sigset信号
SIG_SETMASK  sigset设置当前信号掩码

 

 

  获取调用进程的未决信号

#include <signal.h>

int sigpending(sigset_t* sigset);

成功返回0,失败返回-1

输出未决信号集 sigset

 

9.定时器

  

#include <sys/time.h>

int setitimer(int which,
    const struct itimerval* new_value,
    struct itimercal* old value);

成功返回0,失败返回-1

--which有下面取值
    ITIMER_REAL  真实定时器
    ITIMER_VIRTUAL 虚拟定时器    
    ITIMER_PROF    实用定时器

struct itimerval{
   //重复间隔,取0发送一个信号后,停止
   struct timerval it_interval;
   //初始间隔,取0立即停止计时器
   struct timerval it_value;
};

struct timerval{
    long tv_sec;
    long tv_usec;
};

 

 

10.管道

  mkfifo  myfifo //创建有名管道

  

#include <sys/stat.h>

int mkfifo(const char* pathname,
    mode_t mode);

--pathname :文件路径
--mode:权限模式

 

 

  无名管道--   用于父子进程通信

#include <unistd.h>

int pipe(int pipefd[2]);

成功0,失败-1

pipefd:输出两个文件描述符

pipefd[0]: 无名管道读取数据端
pipefd[1]:无名管道写入数据端

 








以上是关于UNIX C 信号的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp C,SIGINT,SIGALRM,SIGHUP中的Unix信号处理示例......

如何在 unix 中处理 SIGABRT 信号

UNIX 信号和 Traps

Unix环境_信号处理机制

UNIX:SIG_IGN 有相反的含义吗? [复制]

信号处理是Unix和LInux系统为了响应某些状况而产生的事件