C/C++ signal 信号处理函数

软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用kill发送软中断信号。

内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。

注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。

kill -l  ##可以列举当前系统支持的信号

void (*signal(int sig, void (*func)(int)))(int)   ##singal 原型

看例子吧。

 1 #include<stdio.h>
 2 #include<pthread.h>
 3 #include<unistd.h>
 4 #include<signal.h>
 5
 6 bool is_quit = false;
 7
 8 void signal_handle(int signal_num){
 9     printf("receive the signal SIGUSR1\n");
10     is_quit = true;
11 }
12
13 void* do_work(void* arg)
14 {
15     int num = 0;
16     printf("start\n");
17     while(!is_quit){
18         num++;
19         printf("running %d ... \n", num);
20         sleep(2);
21     }
22     printf("end\n");
23     return NULL;
24 }
25
26 int main(int argc, char *argv[])
27 {
28     pthread_t pid;
29     pthread_create(&pid, NULL, do_work, NULL);
30     signal(SIGUSR1, signal_handle);
31     pthread_join(pid, NULL);
32     return 0;
33 }

更多信号函数参考:http://blog.csdn.net/zzyoucan/article/details/9235685

时间: 2024-09-30 21:11:35

C/C++ signal 信号处理函数的相关文章

Linux信号、信号处理和信号处理函数

信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式.在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可以给进程传递数据. 一.信号的来源 信号的来源可以有很多种试,按照产生条件的不同可以分为硬件和软件两种. 1.  硬件方式 当用户在终端上按下某键时,将产生信号.如按下组合键后将产生一个SIGINT信号. 硬件异常产生信号:除数据.无效的存储访问等.这些事件通常由硬件(如:CPU)检测到,并将其通知

2信号处理之:信号产生原因,进程处理信号行为,信号集处理函数,PCB的信号集,sigprocmask()和sigpending(),信号捕捉设定,sigaction,C标准库信号处理函数,可重入函数,

 1信号产生原因 2.进程处理信号行为 manpage里信号3中处理方式: SIG_IGN SIG_DFL                                            默认Term动作 a signal handling function 进程处理信号 A默认处理动作 term   中断 core    core(调试的时候产生) gcc –g file.c ulimit –c 1024 gdb a.out core ign      忽略 stop     停止

在信号处理函数中调用longjmp

错误情况及原因分析 前两天看APUE的时候,有个程序要自己制作一个sleep程序,结果在这个程序中就出现了在信号处理函数中调用longjmp函数的情况,结果就出现了错误,具体错误是啥呢,请参见下面这段程序: 1 /* 2 * 在信号处理函数中调用longjmp的错误情况 3 */ 4 #include <errno.h> 5 #include <setjmp.h> 6 #include <signal.h> 7 #include <string.h> 8 #

linux下的信号处理函数总结

1.信号处理函数 相关函数原型如下: #include <signal.h> sighandler_t signal(int signum, sighandler_t handler); 第一参数是信号 第二个参数是信号处理器:             1.可以是SIG_DFL,信号的默认动作             2. 可以是SIG_IGN,忽略该信号             3. 一个带有一个整型参数的处理函数. #include <signal.h> int sigacti

信号处理函数的返回sigsetjmp/siglongjmp

由于在信号处理期间自动屏蔽了正在被处理的信号,而使用setjmp/longjmp跳出信号处理程序时又不会自动将 信号屏蔽码修改会原来的屏蔽码,从而引起该信号被永久屏蔽. 可以使用sigsetjmp/siglongjmp来解决这一问题. int sigsetjmp(sigjmp_buf env, int savesigs); void siglongjmp(sigjmp_buf env, int val); 如果savesigs非0,则sigsetjmp在env中保存进程的当前信号屏蔽字,在调用s

[学习笔记]信号处理函数遇上可重入和不可重入函数

可重入函数概念 q  为了增强程序的稳定性,在信号处理函数中应使用可重入函数. q  所谓可重入函数是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会出错.因为进程在收到信号后,就将跳转到信号处理函数去接着执行.如果信号处理函数中使用了不可重入函数,那么信号处理函数可能会修改原来进程中不应该被修改的数据,这样进程从信号处理函数中返回接着执行时,可能会出现不可预料的后果.不可再入函数在信号处理函数中被视为不安全函数. q  满足下列条件的函数多数是不可再入的:(1)使用静态的数据结构

信号处理函数误用不可重入函数导致的进程死锁情况

记一次进程死锁的情况: 某天突然发现进程不再运行处理且有没有崩溃产生core文件: 使用gdb -p pid查看堆栈信息如下: 1 #0 0x000000376faf83ae in __lll_lock_wait_private () from /lib64/libc.so.6 2 #1 0x000000376fa7d35b in _L_lock_10288 () from /lib64/libc.so.6 3 #2 0x000000376fa7ab83 in malloc () from /l

stack_t信号处理函数的备用栈

信号处理函数默认会在进程栈创建一个栈帧,但当进程栈的大小到达了限制值的时候,进程会收到SIGSEGV信号,于是进程便不能创建栈帧了,所以程序就直接执行其默认行为(终止进程) . 为了解决这个情况,提出了一个备用栈的概念 使得栈帧在这里创建. 操作如下:    首先要分配一块内存,可以是静态申请的也可以是动态申请的,这个主要使用结构体 struct stack_t. 然后使用系统调用 int sigaltstack(const stack_t *sigstack , stack_t * old_s

C语言的进程中断与信号处理函数

#include "csapp.h" /*编写sleep的包装函数,snooze函数,返回一个进程实际休眠了多少时间*/ unsigned int snooze(unsigned int secs) //secs为总休眠时间 {   unsigned int timeLeft;   unsigned int timeAll=secs;   timeLeft=sleep(timeAll);   printf("Slept for %u of %u secs \n",