(十一)信号通讯编程

 1.核心理论-信号

在Linux系统中,信号(signal)同样也是最为古老的进程 间通信机制

信号来源

  • 程序错误:除零,非法内存访问…
  • 外部信号:终端Ctrl-C产生SGINT信号,定时器到期产生SIGALRM…
  • 显式请求:kill函数允许进程发送任何信号给其他进程或进程组。

信号处理流程

进程对信号的响应

忽略信号:大部分信号可被忽略,除SIGSTOP和SIGKILL信号外(这是超级用户杀掉或停掉任意进程的手段)。

捕获信号:注册信号处理函数,它对产生的特定信号做处理。

让信号默认动作起作用:unix内核定义的默认动作,有5种情况:

                                       a) 流产abort:终止进程并产生core文件。

                                       b) 终止stop:终止进程但不生成core文件。

                                       c) 忽略:忽略信号。

                                       d) 挂起suspend:挂起进程。

                                       e) 继续continue:若进程是挂起的,则resume进程,否则忽略此信号。

信号类型

2.函数学习-信号操作

发送信号 kill

函数原型

 int kill(pid_t pid, int sig);

函数功能

向进程发送信号

所属头文件

<sys/types.h><signal.h>

返回值

成功 0  失败 -1

参数说明

pid   pid>0 指向接收信号的进程     
sig   要发送的信号

处理信号 signal

函数原型

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

函数功能

设置信号的处理方式

所属头文件

<signal.h>

返回值

成功: 返回处理函数的指针     失败SIG_ERR

参数说明

signum,   要处理的信号
handler   对应信号的处理方式  可以取值
                            1 SIG_IGN (忽略信号)
                            2 SIG_DFL (交给内核处理)
                            3 用户自定义函数: 交给用户来处理

3.综合实例编程

A,B进程利用信号通讯

/* send_sig.c */  
  
#include <sys/types.h>  
#include <signal.h>  
#include <stdlib.h>  
  
void main(int arvc, char* argv[])  
{  
    pid_t pid = 0;  
  
    pid = atoi(argv[1]);  
  
    kill(pid, SIGINT);  
  
    puts("Signal was sent.");  
}
/* read_sig.c */  
  
#include <signal.h>  
#include <unistd.h>  
#include <stdio.h>  
  
void myfunc(int num)  
{  
    puts("Process sd_proc received SIGINT.");  
}  
  
void main()  
{  
    signal(SIGINT, myfunc);  
  
    pause();  
} 

猜你喜欢

转载自blog.csdn.net/qq_34863439/article/details/89068084