linux 进程通信之 信号

信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。

信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了那些系统事件。

如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递个它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞取消时才被传递给进程。

信号的产生

1.用户在终端按下某些键时,终端驱动程序会发送信号给前台进程,例如ctr+c产生SIGINT, ctr + \产生SIGQUI信号,ctr + z产生SIGTSTP。

2.硬件异常产生信号,这些条件由硬件检测到并通知内核,然后内核向当前进程发送适当的信号。例如当前进程执行了除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释为SIGFPE信号发送给进程。再比如当前进程访问了非法内存地址,MMU会产生异常,内核将这个异常解释为SIGSEGV信号发送给当前进程 。

3.一个进程调用int kill(pid_t pid,int sig)函数可以给另一个进程发送信号

4.可以用kill命令给某个进程发送信号,如果不明确指定信号则发送SIGTERM信号,该信号的默认处理动作是终止进程。

5.当内核检测到某种软件条件发生时也可以通过信号通知进程,例如闹钟超时产生SIGALRM信号,向读端已关闭的管道写数据时产生SIGPIPE信号。

进程对信号的处理

1.忽略此信号

大多数信号都按照这种方式进行处理,担忧两种信号却决不能被忽略。它们是: SIGKILL 和 SIGSTOP。 这两种信号不能停止的原因是:它们向超级用户提供了一种终止或停止进程的方法。

2.执行用户希望的动作

通知内核在某种信号发生时,调用一个用户函数。在用户函数中,执行用户希望的处理。

3.执行系统默认动作

对大多数信号的系统默认动作是终止该进程。

信号相关API

int raise(int sig);
# 向自己发送信号
# sig : 信号的signum
int kill(pid_t pid, int sig);
# 向一个指定的进程发送信号
# 参数说明
# kill 的 pid 参数有4中不同的情况
# pid > 0 : 将信号发送给进程ID为pid的进程
# pid == 0 : 将信号发送给同组的进程
# pid < 0 : 将信号发送给其进程组 ID 等于 pid绝对值的进程
# pid == -1 : 将信号发送给所有进程。
# sig:信号的signum
# signum参考 http://blog.csdn.net/u011641885/article/details/47252003
unsigned int alarm(unsigned int seconds);
# 使用 alarm 函数可以设置一个时间值(闹钟时间),当所设置的时间到了,产生 SIGALRM 信号。
# 如果不捕捉此信号, 则默认动作是终止该进程。
# seconds : 经过指定的 seconds 秒后会产生信号 SIGALRM。

# 每个进程只能有一个闹钟时间。
# 如果在调用 alarm 时,以前已为该成绩设置过的闹钟时间,
# 而且它还没有超时,以前登记的闹钟时间则被刷新

# 如果以前登记的尚未超过的闹钟时间,
# 而这次 seconds 值是 0, 则表示取消以前的闹钟。
int pause(void);
# pause 函数使调用进程挂起直至捕捉到一个信号
# 只有执行了一个信号处理函数后,挂起才结束。
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
# 注册信号,收到执行信号后做何处理
# 参数 handler 有三种情况
# SIG_IGN : 忽略该信号
# SIG_DFL : 采用系统默认方式处理信号
# 自定义的信号处理函数指针.(执行自定义操作)

示例:

#include <signal.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void mysingal(int signum){
    switch(signum){
        case    SIGINT:
        case
            break;
    }
    return;
}

int main(int argc, char *argv[]){
    char buf[128];
    signal(SIGINT,mysingal);
    while(1){

        printf("[email protected]> ");

        fgets(buf,sizeof(buf),stdin);
        if(buf[0] == ‘\r‘)
            continue;

        system(buf);    

    }   

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-07 01:46:32

linux 进程通信之 信号的相关文章

Linux 进程通信之 ——信号和信号量总结

如今最经常使用的进程间通信的方式有:信号,信号量,消息队列,共享内存.       所谓进程通信,就是不同进程之间进行一些"接触",这种接触有简单,也有复杂.机制不同,复杂度也不一样.通信是一个广义上的意义,不仅仅指传递一些massege.他们的用法是基本相同的,所以仅仅要掌握了一种的用法,然后记住其他的用法就能够了. 1. 信号       在我学习的内容中,主要接触了信号来实现同步的机制,据说信号也能够用来做其他的事      情,可是我还不知道做什么.       信号和信号量是

linux进程通信之信号

本节主要学习信号和与信号相关的处理函数,后续还会更新. http://blog.csdn.net/xiaoliangsky/article/details/40264151 一 信号 信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动.通常信号是由一个错误产生的.但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程.一个信号的产生叫生成,接收到一个信号叫捕获. 二 信号的种类 Signal         Descrip

浅析linux进程通信的方式

求职笔试中,考察进程通信方式是一个老生长谈的问题,每次都让我答得一头雾水,于是我总结了一下 这些必须了解的知识点. 实现linux进程通信的方式有6种: --内存共享 --信号(Singal) --管道(Pipe) --消息队列(Message) --信号量(Semaphore) --socket 消息队列通信 请关注:http://blog.csdn.net/ljianhui/article/details/10287879 内存共享通信 请关注:http://blog.csdn.net/lj

linux进程通信之SYSTEM V信号量

信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有.信号量的值为正的时候,说明它空闲.所测试的线程可以锁定而使用它.若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒. 一.信号量的分类: 在学习信号量之前,我们必须先知道--Linux提供两种信号量: (1) 内核信号量,由内核控制路径使用. (2) 用户态进程使用的信号量,这种信号量又分为POSIX信号量和SYSTEM V信号量. POSIX信号量又分为有名信号量和无名信号量.有名信号量,其值保存在文件

Linux进程通信----匿名管道

Linux进程通信中最为简单的方式是匿名管道 匿名管道的创建需要用到pipe函数,pipe函数参数为一个数组 表示的文件描述字.这个数组有两个文件描述字,第一个是用 于读数据的文件描述符第二个是用于写数据的文件描述符. 不能将用于写的文件描述符进行读操作或者进行读的文件描述 符进写操作,这样都会导致错误. 关于匿名管道的几点说明: 1.匿名管道是半双工的,即一个进程只能读,一个进程只能写    要实现全双工,需要两个匿名管道. 2.只能在父子进程或者兄弟进程进行通信. 3.在读的时候关闭写文件描

Linux进程通信——管道

进程间通信(IPC:Inner Proceeding Communication) 进程是操作系统实现程序独占系统运行的假象的方法,是对处理器.主存.I/O设备的抽象表示.每个进程都是一个独立的资源管理单元,每个进程所看到的是自己独占使用系统的假象,因此各个进程之间是不能够直接的访问对方进程的资源的,不同的进程之间进行信息交互需要借助操作系统提供的特殊的进程通信机制. 进程之间的通信,从物理上分,可以分为同主机的进程之间的通信和不同主机间的进程之间的通信.从通信内容方式上分,可以分为数据交互.同

linux进程通信

e14: 进程间通信(进程之间发送/接收字符串/结构体): 传统的通信方式: 管道(有名管道 fifo,无名管道 pipe) 信号 signal System V(基于IPC的对象):                             IPC对象:                                                    ipcrm [ -M key | -m id | -Q key | -q id | -S key | -s id ] ... 消息队列 mes

Linux笔记--Linux进程通信

Linux进程间通信 文章来源: http://www.cnblogs.com/linshui91/archive/2010/09/29/1838770.html 一.进程间通信概述进程通信有如下一些目的:A.数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间B.共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到.C.通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程).D.

Linux进程通信的几种方式总结

进程通信的目的 数据传输 一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据 多个进程想要操作共享数据,一个进程对共享数据 通知事 一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程). 资源共享 多个进程之间共享同样的资源.为了作到这一点,需要内核提供锁和同步机制. 进程控制 有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变.