进程通信--信号 听课笔记

信号的产生:
1 按下按键
2 硬件异常信号:除数为0,无效的存储访问
3 用kill函数将信号发给另一个线程
4 用kill命令将信号发给另一个线程

常见信号:
SIGUP  从终端发出的结束信号
SIGINT 来自键盘的中断信号( Ctrl-C)
SIGKILL 该信号结束接受信号的进程
SIGTERM kill命令发出的信号
SIGCHLD  标志子进程停止或结束的信号
SIGSTOP 来自键盘(Ctrl-Z)或者调试程序的停止执行信号

信号处理
1 忽略此信号
但SIGKILL和SIGSTOP不能被忽略
2 执行用户希望的动作
通知内核在某种信号发生时,调用一个用户函数
3 执行系统默认动作
大多数默认动作时中止该进程

信号发送
kill和raise函数
kill向自己和别的进程发信号
raise只能向自身发信号

#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int signo)
int raise(int signo)


alarm函数: 定时发送SIGALARM信号, 默认动作时中止该进程
#include <unistd.h>
usigned int alarm(usigned int secondes)

每个进程只能有一个闹钟时间,新alarm会替换原alarm
seconds=0表示取消以前的闹钟

pause函数: 使调用进程挂起,知道捕捉到一个信号
#include <unistd.h>

int pause(void)


信号的处理
1 使用简单的signal函数
2 使用信号集函数组

指定某个信号的处理函数
#include <signal.h>

void (*signal(int signo, void (*func)(int)))(int)

//等价于
typedef void (*sighandler_t)(int)//返回值为函数指针
//参数和返回值均是函数指针
sighandler_t signal(int signum, sighandler_t handler))


Func可能的值是:
1 SIG_IGN 忽略此信号
2 SIG_DFL 按默认方式处理
3 信号处理函数名 使用该函数处理 该函数的参数必须是int, 无返回值

示例:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

void my_func(int sign_no){
    if(sign_no==SIGINT)
        printf("I have get SIGINT\n");
    else if(signo==SIGQUIT)
        printf("I have get SIGQUIT\n");
}

int main(){
   printf("waiting for signal SIGNT or SIGQUIT \n");
   //注册信号处理函数
   signal(SIGINT, my_func);
   signal(SIGQUIT, my_func);
   
   pause();//等待处理信号
   exit(0);
}

你可能感兴趣的:(C++,c,C#)