进程间通信学习笔记二(信号通信)

信号通信


用户按某些键时,产生信号
硬件异常产生信号
进程用kill函数将信号发送给另一个进程
可以用kill函数将信号发送给其他进程


信号的类型
1 sighup 从终端上发出的结束信号
2 sigint 来自键盘的中断信号(ctrl-c)
3 sigquit
4 sigill
5 sigtrap
6 sigiot
7 sigbus
8 sigfpe
9 sigkill  结束接收信号的进程
10 sigusr1
11 sigsegv
12 sigusr2
13 sigpipe
14 sigalrm
15 sigterm kill命令发出的信号
17 sigchld 标识子进程停止或结束的信号
18 sigcont
19 sigstop 来自键盘(crtl-z)或调试程序的停止执行信号
20 sigtstp
21 sigttin
22 sigttou
23 sigurg
24 sigxcpu
25 sigxfsz
26 sigvtalrm
27 sigprof
28 sigwinch
29 sigio
30 sigpwr


信号处理
当信号出现时,将按照下列三种方式中的一种进行处理:
1 忽略此信号
  sigkill和sigstop这两种信号除外
2 执行用户希望的动作
3 执行系统默认动作


信号的发送


发送信号的主要函数有:
kill: 可以向自身发送信号,也可以向其他进程发送信号
raise:向进程自身发送信号
函数原型:
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid,int signo)
int raise(int signo)


alarm
使用alarm函数可以设置一个时间值,当设置时间到时,会产生一个sigalrm信号
如果不捕捉此信号,默认动作是终止该进程
注:每个进程只能有一个闹钟时间,当seconds值是0,表示取消以前的闹钟
函数原型:
#include <unistd.h>
unsigned int alarm(unsigned int seconds)
seconds:经过了指定的seconds秒后会产生信号sigalrm




pause
使调用进程挂起直至捕捉到一个信号
函数原型:
#include <unistd.h>
int pause(void)


信号的处理
1可以忽略该信号或是使用指定的处理函数来处理该信号,或者使用系统默认的方式
2 使用简单的signal函数,或是使用信号集函数组




signal
函数原型 
#include <signal.h>
void (*signal(int signo,void(*func)(int)))(int)
func可能的值是:
sig_ing 忽略此信号
sig_dfl 按系统默认方式处理
信号处理函数名  使用该函数处理




示例代码如下:
#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(sign_no==SIGQUIT){
                printf("i have get SIGQUIT\n");
        }
}


int main(){
        printf("waiting for signal SIGNINT or SIGQUIT \n");
        /*注册信号处理函数*/
        signal(SIGINT,my_func);
        signal(SIGQUIT,my_func);


        pause();
    exit(0);
}


编译执行:
[root@localhost app]# gcc mysignal.c -o mysignal
[root@localhost app]# ./mysignal 
waiting for signal SIGNINT or SIGQUIT 


打开另一终端
查看进程id
[root@localhost ~]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      9837  0.0  0.0   1624   308 pts/1    S+   02:38   0:00 ./mysignal


查看返回结果:
i have get SIGINT

你可能感兴趣的:(进程间通信学习笔记二(信号通信))