Linux C/C++编程:signal

signal

理论

函数原型:

#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

  • signum参数:传入的信号类型
  • handler参数:处理信号的函数,函数接受一个整型参数,用于表示信号;函数的返回值是void类型。在函数内部编写处理信号的方法。

示例

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void sig_handler(int signo) {
  if (signo == SIGINT) {
    puts("received SIGINT");
  }
}

int main() {
  if (signal(SIGINT, sig_handler) == SIG_ERR) {
    puts("can not catch SIGINT");
  }

  while (1) { 
    sleep(1);
  }

  return 0;
}

Linux C/C++编程:signal

#include <signal.h>
#include<stdio.h>
#include <unistd.h>

void  handler();

int main()
{
    int i;

    signal(SIGALRM,handler);
    alarm(5);

    for(i=1;i<8;i++){
        printf("sleep is -----%d\n",i);
        sleep(1);
    }
    return 0;
}

void  handler()
{
    printf("hello\n");
}


Linux C/C++编程:signal
同一种信号多次发生,通常并不讲它们排队,所以如果在某种信号被阻塞时它发生了五次,那么对这种信号解除阻塞后,其信号处理函数通常只会被调用一次。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
static void sig_int(int);

int main(void)
{
    if(signal(SIGINT,sig_int) == SIG_ERR)
        perror("can't catch SIGINT\n");

    for(;;)
        pause;
}

void sig_int(int signo)
{
    printf("received SIGINT\n");
    sleep(10);
    printf("after sleep 10s\n");
}

Linux C/C++编程:signal

上一篇:Java并发包源码学习系列:详解Condition条件队列、signal和await


下一篇:Linux signal 信号