嵌入式 Linux进程间的通信--信号

简介: 嵌入式 Linux进程间的通信--信号

信号

  信号的概述

  软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。简单来说,信号就是 给进程发送命令。比如结束命令 CTRL+C ,让进程无条件结束运行。我们也可以通过给进程发送 命令,让它执行相应的操作,通过 signal 函数实现。

  异步就是不需要特意等待某一信号到来,当信号来了时候(相当于软中断),会通知进程然后 执行相应操作。

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

(1)捕获信号并处理

(2)忽略信号 SIGKILL SIGSTOP

(3)接收默认处理

 在进程表的表项中有一个软中断信号域,该域中每一位对应一个信号,当有信号发送给进程时, 对应位置位。由此可以看出,进程对不同的信号可以同时保留,但对于同一个信号,进程并不知道 在处理之前来过多少个。

信号类型

信号发送

1、kill 函数

2、raise函数

3、pause函数

信号处理

  当系统捕捉到某个信号时,可以忽略该信号或者用指定的函数处理,或者使用系统默认的方式。 信号处理的方式主要有两种,一种是使用简单的 signal 函数,另外一种是使用信号集函数组 sigaction。

函数原型 sighandler_t signal(int signum, sighandler_t handler);
功能 信号的处理
参数

signum:指明要处理的信号,它可以取除了 SIGKILL 和 SIGSTOP 外的任何一种信号 handler:描述了与信号关联的动作, 取值可以是以下三种: ② 函数地址:接收到对应的信号,就跳转到指定中断;

② SIG_IGN:忽略该信号; ③ SIG_DFL:采用系统默认处理;

返回值 返回先前的信号处理函数指针,如果有错误则返回 SIG_ERR(-1)
例程

显示详细信息

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.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 SIGINT or SIGQUIT \n ");
   /*注册信号处理函数*/
signal(SIGINT, my_func); /*CTRL -C*/
signal(SIGQUIT, my_func);/*CTRL -\*/
signal(SIGCHLD, SIG_IGN);/*SIGCHLD --子进程结束信号*/
pause(); /*将进程挂起,知道有信号才退出*/
exit(0);
}


相关文章
|
4天前
|
消息中间件 算法 Linux
【Linux】详解如何利用共享内存实现进程间通信
【Linux】详解如何利用共享内存实现进程间通信
|
4天前
内存映射实现父子进程通信
内存映射实现父子进程通信
|
4天前
利用命名管道实现任意进程间的通信
利用命名管道实现任意进程间的通信
|
4天前
|
Linux 数据库
linux守护进程介绍 | Linux的热拔插UDEV机制
linux守护进程介绍 | Linux的热拔插UDEV机制
linux守护进程介绍 | Linux的热拔插UDEV机制
|
4天前
|
Unix Linux 调度
linux线程与进程的区别及线程的优势
linux线程与进程的区别及线程的优势
|
4天前
|
Linux 调度 C语言
|
4天前
|
存储 安全 Linux
【Linux】详解进程通信中信号量的本质&&同步和互斥的概念&&临界资源和临界区的概念
【Linux】详解进程通信中信号量的本质&&同步和互斥的概念&&临界资源和临界区的概念
|
4天前
|
存储 Linux Shell
Linux:进程等待 & 进程替换
Linux:进程等待 & 进程替换
30 9
|
4天前
|
存储 Linux C语言
Linux:进程创建 & 进程终止
Linux:进程创建 & 进程终止
27 6