linux下基于C语言的信号编程实例

 更新时间:2015年07月30日 11:24:19   作者:share_good  
这篇文章主要介绍了linux下基于C语言的信号编程,实例分析了信号量的基本使用技巧与相关概念,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了linux下基于C语言的信号编程方法。分享给大家供大家参考。具体如下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void sig_handler(int sig_no, siginfo_t *info, void *ctext){
  printf("receive sig_no=%d\n",sig_no);
  if(sig_no == SIGQUIT){
    printf("haha,想退出了吗?");
  }else{
    printf("si_signo=%d\n",info->si_signo);
    printf("si_code =%d\n",info->si_code);
    printf("si_pid =%d\n",info->si_pid);
    printf("si_uid =%d\n",info->si_uid);
    printf("si_status=%d\n",info->si_status);
    printf("si_utime =%lld\n",info->si_utime);
    printf("si_stime =%lld\n",info->si_stime);
    printf("si_value =%d\n",info->si_value);
    printf("si_addr =0x%x\n",info->si_addr);
    printf("si_fd  =%d\n",info->si_fd);
  }
  return ;
}
/*--------------------常用信号列表----------------------------*/
//SIGINT ctrl+c 
//SIGQUIT ctrl+\
//SIGPIPE 管道破裂
//SIGKILL 进程终止,不能被捕获
//SIGHUP shell退出
//SIGCHLD 子进程终止信号
//SIGFPE 浮点数异常(除以0之类的)
//SIGTERM 终止信号(kill pid)
int main(int argc ,char **argv){
  struct sigaction sa;
  sa.sa_flags  = 0;
  sa.sa_sigaction = sig_handler;
  sa.sa_flags  |= SA_SIGINFO;  //使用sa_sigaction作为回调
  //sa.sa_flags |= SA_RESETHAND; //处理函数只会被调用一次,之后被重置
  //sa.sa_flags |= SA_NOCLDSTOP; //如果安装了SIGCLD,子进程不是正常退出,而是被kill掉了,则不会通知
  //sa.sa_flags |= SA_NODEFER ;  //使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号
  //sa.sa_flags |= SA_RESTART ;  //使被信号打断的系统调用自动重新发起
  //sa.sa_flags |= SA_NOCLDWAIT; //使父进程在它的子进程退出时不会收到 SIGCHLD 信号,这时子进程如果退出也不会成为僵尸进程
  //安装信号
  if(sigaction(SIGINT,&sa,NULL)==-1) printf("安装信号失败\n");
  if(sigaction(SIGQUIT,&sa,NULL)==-1) printf("安装信号失败\n");
  while(1){
    sleep(1);
  }
  return 0;
}
/*--------------------------信号编程相关结构体----------------------------------*/
 // struct sigaction {
 //   void (*sa_handler)(int);
 //   void (*sa_sigaction)(int, siginfo_t *, void *);
 //   sigset_t sa_mask;
 //   int sa_flags;
 //   void (*sa_restorer)(void);
 // }
// siginfo_t {
//    int   si_signo; /* Signal number */
//    int   si_errno; /* An errno value */
//    int   si_code;  /* Signal code */
//    pid_t  si_pid;  /* Sending process ID */
//    uid_t  si_uid;  /* Real user ID of sending process */
//    int   si_status; /* Exit value or signal */
//    clock_t si_utime;  //User time consumed 
//    clock_t si_stime; /* System time consumed */
//    sigval_t si_value; /* Signal value */
//    int   si_int;  /* POSIX.1b signal */
//    void *  si_ptr;  /* POSIX.1b signal */
//    void *  si_addr;  /* Memory location which caused fault */
//    int   si_band;  /* Band event */
//    int   si_fd;   /* File descriptor */
// }
// 信号    值      动作 解释
// SIGHUP  1          终端线路挂断
// SIGINT  2      Term  键盘输入的中断命令,从终端输入 Ctrl-C 时发生
// SIGQUIT 3      Core  键盘输入的退出命令
// SIGILL  4      Core  错误指令
// SIGABRT 6      Core  abort(3)发出的中止信号
// SIGFPE  8      Core  浮点数异常
// SIGKILL 9      Term  KILL信号
// SIGSEGV 11      Core  非法内存访问
// SIGPIPE 13      Term  管道断开
// SIGALRM 14      Term  alarm(2)发出的中止信号
// SIGTERM 15      Term  强制中止信号
// SIGUSR1 30,10,16   Term  用户自定义信号1
// SIGUSR2 31,12,17   Term  用户自定义信号2
// SIGCHLD 20,17,18   Ign  子进程中止信号
// SIGCONT 19,18,25   Cont  继续执行一个停止的进程
// SIGSTOP 17,19,23   Stop  非终端来的停止信号
// SIGTSTP 18,20,24   Stop  终端来的停止信号
// SIGTTIN 21,21,26   Stop  后台进程读终端
// SIGTTOU 22,22,27   Stop  后台进程写终端

希望本文所述对大家的C语言程序设计有所帮助。

相关文章

  • C++实现迷宫生成与解决

    C++实现迷宫生成与解决

    这篇文章主要为大家详细介绍了C++实现迷宫生成与解决,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C语言实现最小生成树构造算法

    C语言实现最小生成树构造算法

    这篇文章主要为大家详细介绍了C语言实现最小生成树构造算法,利用Prim算法或kruskal算法求解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • c++ 一个二进制串转化为整数的解决方法

    c++ 一个二进制串转化为整数的解决方法

    以下是将一个二进制串转化为整数的实例。需要的朋友参考下
    2013-05-05
  • 一起来练习C++的指针

    一起来练习C++的指针

    这篇文章主要为大家详细介绍了C++的指针,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C语言简明分析指针与引用的具体用法

    C语言简明分析指针与引用的具体用法

    指针是一个实体,引用是一个别名;在汇编上,引用的底层是以指针的方式实现的,定义一个引用变量,相当于定义了一个指针,然后把引用内存的地址写到这个指针里面,当通过引用变量修改它所引用的内存时,它先访问了指针里面的地址,然后在这个地址的内存里面对值进行修改
    2022-05-05
  • Qt自定义表头实现过滤功能的方法

    Qt自定义表头实现过滤功能的方法

    这篇文章主要个给大家介绍了关于Qt自定义表头实现过滤功能的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Qt具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • C++ 非递归实现二叉树的前中后序遍历

    C++ 非递归实现二叉树的前中后序遍历

    本文将结合动画和代码演示如何通过C++ 非递归实现二叉树的前中后序的遍历,代码具有一定的价值,感兴趣的同学可以学习一下
    2021-11-11
  • C语言 volatile与const同时使用应注意的问题

    C语言 volatile与const同时使用应注意的问题

    “volatile”的含义是“请不要做没谱的优化,这个值可能变掉的”,而并非“你可以修改这个值”。因此,它们本来就不是矛盾的
    2013-09-09
  • C语言如何建立链表并实现增删查改详解

    C语言如何建立链表并实现增删查改详解

    这篇文章主要给大家介绍了关于C语言如何建立链表并实现增删查改的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • C语言文件操作入门指南

    C语言文件操作入门指南

    我们在想既然是通讯录就应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在,这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式,使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化
    2024-08-08

最新评论