信号(signal)机制是Unix系统中最为古老的进程间通信机制,很多条件可以产生一个信号:
一.当用户按某些键时,产生信号。
二.硬件异常产生信号:除数为零,非法的存储访问等等。这些情况通常是由硬件检测到,将其通知内核,然后内核产生适当的信号通知进程,例如,内核对正在访问一个无效存储区的进程产生一个
SIGSEGV(SIG is a common prefix for signal names; SEGV is an abbreviation of segmentation violation)。
三.进程用kill函数将信号发送给另一个进程
四.用户可用kill命令将信号发送给其它进程
几种常见信号:
SIGHUP:从终端上发出的结束信号
SIGINT:来自键盘的中断信号(Ctrl-C)
SIGKILL :该信号结束接收信号的进程
SIGTERM:kill命令发出的信号
SIGCHLD:标识子进程停止或结束的信号
SIGSTOP:来自键盘(Ctrl-Z)或调试程序的停止执行信号
当某信号出现时,将按照下列三种方式中的一种进行处理:
一.忽略次信号
大多数信号都按照这种方式进行处理,但是有两种信号却不能被忽略。它们是:
SIGKILL和SIGSTOP。这两种信号不能被忽略的原因是:它们向超级用户提供了一种终止或者停止进程的方法。
二.执行用户希望的动作
通知内核在某种信号发生时,调用一个用户函数。在这个用户函数中执行用户希望的处理。
三.执行系统默认的动作
对大多数信号的系统默认动作时终止该进程
信号发送
发送信号的主要函数有kill和raise。
区别:
Kill既可以向自身发送信号,也可以向其它进程发送信号。
raise函数是向进程自身发送信号。
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int signo)
int raise(int signo)
alarm函数可以设置一个时间值(闹钟时间),当所设置的时间到了时,产生SIGALRM信号。如果捕捉不到次信号,择默认动作时终止该进程。
#include <unistd.h>
unsigned int alarm(unsigned int seconds)
Seconds:指的是经过了指定的seconds秒后会产生信号SIGALRM。
pause函数使得调用进程挂起直至捕捉到一个信号。
#include <unistd.h>
int pause(void)
只有执行了一个信号处理函数后,挂起才结束。
信号的处理:当系统捕捉到某个信号时,可以忽略该信号或是使用指定的处理函数来处理该信号,或者使用系统默认的方式。
信号的处理的主要方法有两种:一是使用简单的signal函数,另一个是使用信号集函数族。
#include <signal.h>
void (*signal(int signo, void (*func)(int)))(int)
相当与下面两步操作:
typedef void (*sighander_t)(int) //定义一个函数类型为sighander_t
sighander_t signal(int signum, sighandler_t hander))
//signal 函数的返回值类型为sighander_t,参数为int型和sighander_t型
func可能的值为:
一.SIG_IGN:忽略此信号
二.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 SIGINT or SIGQUIT \n ");
signal(SIGINT, my_func);
signal(SIGQUIT, my_func);
pause();//调用进程挂起直至捕捉到一个信号,挂起才结束
exit(0);
}
注意:
首先在一个命令中端中执行该程序 ./mysignal
开启另一新的终端:用ps –aux 查看运行该程序的进程PID ps -aux
可以找到:
root 3891 0.0 0.0 1500 308 pts/1 S+ 12:54 0:00 ./mysignal
用kill命令向查看得到的进程号为PID的进程发送SIGINT or SIGQUIT kill -s SIGINT 3891
分享到:
相关推荐
【linux学习笔记--18】POSIX IPC——信号量.doc 【linux学习笔记--19】POSIX IPC——共享内存.doc 【linux学习笔记-10】Linux进程相关系统调用(三).doc 【linux学习笔记-11】守护进程daemon.doc 【linux学习笔记-...
【linux学习笔记-1】使用GDB调试简单的用户程序 【linux学习笔记-2】父子进程共享文件描述符 【linux学习笔记-3】文件操作...【linux学习笔记--18】POSIX IPC——信号量 【linux学习笔记--19】POSIX IPC——共享内存
在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)是实现多个进程协同工作的重要手段。其中,信号(Signal)是一种轻量级、异步的通信方式,它允许一个进程向另一个进程发送一个通知,表明某个...
标题“Matlab生成dsp程序——IPC通信.zip”指的是使用MATLAB软件来创建数字信号处理(DSP)程序,并利用Inter-Process Communication(IPC)技术进行进程间的通信。MATLAB是一款强大的数学计算和仿真环境,它提供了...
首先,Linux系统提供了多种传统的IPC方式,如socket、命名管道(named pipe)、消息队列(message queue)、信号(signal)以及共享内存(share memory)。这些机制在Java系统中同样适用,包括Android应用程序。然而...
### 实验一 进程通信——管道和信号实验报告 #### 实验背景及目标 本实验旨在通过实际操作深入理解进程通信的相关概念和技术,特别是管道和信号这两种进程间通信方式。实验目标具体包括: 1. **加深对进程概念的...
### 详解Linux进程间通信——使用信号量 #### 一、什么是信号量 信号量是一种常用的同步机制,用于解决多进程或线程并发访问共享资源时可能出现的竞争条件问题。在多进程环境中,当多个进程尝试同时访问同一个共享...
### Linux环境下的进程间通信——信号灯 #### 一、信号灯概述 信号灯是一种用于进程间通信(IPC)的机制,主要用于协调多个进程对共享资源的访问控制。它可以被视为一种内存中的标志,用来指示资源的可用性。进程...
本文将详细讲解一种常见的IPC方式——信号(Signal)通信,特别是其中的定时信号(Timed Signal)实例。信号是Linux提供的一种异步事件通知机制,它允许一个进程向另一个进程发送一个简短的消息,告知接收进程发生了...
### 进程间通讯IPC——进程调用 #### 进程的同步机制 在操作系统领域,进程间的同步机制是确保多个进程能够正确、有序地访问共享资源的关键技术。本章节将详细探讨进程间的同步机制,包括但不限于进程互斥、信号量...
本文将重点讨论其中的一种通信方式——信号通信,并通过具体的信号发送实例来解析其工作原理。 首先,信号是Linux系统提供的一种异步事件通知机制,允许一个进程向另一个进程发送消息,通常用于进程控制、错误处理...
本文将深入探讨一种常见的IPC方式——信号(Signal)通信,通过几个实例来阐述其基本概念和使用方法。 信号是Linux系统中用于进程间通信的一种轻量级机制,它允许一个进程向另一个进程发送一个消息,告知接收进程...
本文将详细讲解Linux C编程中的一种进程间通信方式——信号灯(Semaphore),并结合提供的程序源码进行解析。 信号灯是同步原语之一,它允许进程在执行过程中对某些资源进行互斥访问或同步操作。信号灯由两个基本...
本文将深入探讨一个经典的多进程同步问题——哲学家就餐问题,并阐述如何利用信号量来解决这个问题。 哲学家就餐问题由计算机科学家Edsger W. Dijkstra提出,用以模拟并发环境下的资源竞争问题。问题描述如下:有五...
【Linux下C语言编程——进程通信】 在Linux操作系统中,进程通信(IPC,Inter-Process Communication)是不同进程之间交换信息的重要方式。本篇主要讨论Linux下的几种进程通信机制,包括POSIX无名信号量、System V...
本文将深入探讨Linux系统中的一个特定IPC机制——信号量(Semaphore)及其在进程同步中的应用。信号量是一种用于控制多个进程对共享资源访问的同步工具,它能有效地防止竞态条件和死锁的发生。 信号量是一个整数值...
标题“信号完整性分析”所涉及的知识点主要集中在电子工程领域,特别是在高速数字电路设计中的一个关键问题——信号完整性。信号完整性是指电子信号在电路中传输时保持其原始特性(如幅度、形状、频率等)的能力。这...