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]:无名管道写入数据端
原文地址:https://www.cnblogs.com/Kernel001/p/7808640.html