linux_c开发(5-3)进程间通讯_信号通讯

信号通讯

信号(signal)机制是UNIX系统中最为古老的进程间通信机制,有很多条件可以产生一个信号:

1、 当用户按某些按键时,产生信号。

2、 硬件异常产生信号:除数为零,无效的存储访问等等。这些信号通常有硬件检测得到,将其通知内核,然后内核产生适当的信号通知进程,例如: 内核对正在访问一个无效存储区的进程产生一个SIGSEGV信号。

3、进程用kill函数将信号发送给另一个进程。

4、 用户可以用kill命令将信号发送给其他进程。

信号类型

几种常见的信号

SIGHUP: 从终端发来的结束信号

SIGINT: 来自键盘的中断信号(ctrl+c)

SIGKILL: 该信号结束接收信号的进程

SIGTERM: KILL命令发出的信号

SIGCHLD: 表示子进程停止或结束的信号

SIGSTOP: 来自键盘(ctrl+Z)或调试程序的停止执行信号

信号处理

当某信号出现时,将按下面三种方式中的一种处理:

1、忽略此信号

大多数信号都是按这种方式处理的,但有两种信号不能被忽略。SIGKILL和SIGSTOP。这两种信号不能被忽略的原意是他们向超户提供了一种终止或停止进程的一种方法。

2、执行用户希望的动作

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

执行系统默认动作

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

信号发送

发送信号的主要信号有kill和raise。

区别:

kill既可以向自身发送信号,也可以向其他进程发送信号。而raise函数是向进程自身发送信号。

#include(sys/types.h)
#include(signal.h)
int kill(pid_t pid,int signo)
int raise(int signo)

kill的pid参数有四种不同情况:

1、pid>0

将信号发送给进程ID为pid的进程。

2、pid==0

将信号发送给同组进程。

3、pid<0

将信号发送给其进程组ID等于pid绝对值得进程。

4、pid==-1

将信号发送给所有进程。

Alarm

使用alarm函数可以设置一个时间值(闹钟时间),当到达所设定的时间,产生SIGALRM 信号。如果不捕捉此信号,则默认动作是终止该进程。

#include<unistd.h>
insigned int alarm(unsigned int seconds)

Seconds:经历指定的秒数后会产生信号SIGALRM。

Pause

pause函数使调用函数挂起直至捕捉到一个信号。

#include<ubistd.h>

int pause(void)

只有执行了一个信号处理函数后,挂起才结束。

信号的处理

§当系统捕捉到某个信号时,可以忽略该信号或是使用指定的处理函数来处理该信号,或是使用系统默认的方式。

§§ 信号的处理方法主要有两种,一种是使用简单的signal函数,另一种是使用信号集函数组。

signal

#include<signal.h>
void(*signal(int signo,void(*func)(int)))(int)
//可以理解为
//typedef void(*sighandler_t)(int)
//sighandler_t signal(int signum,sighandler_t handler)

Func可能是:

1、SIG_IGN:忽略此信号

2、SIG_DEL:按系统默认方式处理

3、信号处理函数名:使用该函数处理

#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);
}

这里我们运行起程序之后用kill给进程发送信息。格式为:

 kill -s  信息  pid

进程号可以用:ps aux 查看

例如我查的我的进程号为623 那么我的发送信息格式为:kill -s SIGQUIT 623

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

时间: 2024-12-15 10:45:08

linux_c开发(5-3)进程间通讯_信号通讯的相关文章

linux_c开发(5-2)进程间通讯_管道通讯

管道通信 什么是管道? 管道是单向的.先进先出的,他把一个进程的输出和另一个进程的输入连接在一起.一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据. 管道创建 管道包括无名管道和有名管道两种,前者用于父进程和子进程间的通讯,后者可用于同一系统中的任意两个进程间的通讯. 无名管道由pipe()函数创建: int pipe(int filedis[2]); 当一个管道建立时,他会创建两个文件描述符: filedis[0]用于读管道,filedis[1]用于写管道. 管

linux_c 开发(6-1)多线程程序设计_线程基础

多线程 线程(thread)技术早在60年代就被提出来了,但真正应用多线程到操作系统中去,实在80年代中期,solaris是这方面的佼佼者.传统的UNIX也支持线程的概念,但是在一个进程中只允许有一个线程,这样多线程就意味着多进程.现在多线程技术已经被许多操作系统所支持,包括Windows/NT.Linux. 优点: 和进程相比,它是一种非常"节俭"的多任务操作方式.在linux系统下,启动一个新的进程必须分配给他独立的空间地址,建立众多的数据表来维护他的代码段.堆栈段和数据段,这是一

linux_c 开发(5-5)进程间通讯_消息队列

进程间通讯_消息队列 定义: UNIX早起通信机制之一的信号能够传送的信息量有限,管道则只能传送无格式的字节流,这无疑会给应用程序开发带来不便.消息队列(也称报文队列)则克服了这些缺点. 发展: 消息队列就是一个消息的链表.可以把消息看做一个记录,**具有特定的格式.进程可以向中按照一定的规则添加新消息:另一些进程则可以从消息队列中读取消息. 分类: 目前主要有两种类型的消息队列:POSIX消息队列 以及系统V消息队列,系统V消息队列目前被大量使用. 持续性:系统V消息队列是随内核持续的,只有在

linux_c开发(5-4)进程间通讯_共享内存通讯

共享内存 共享内存 是被多个进程共享的一部分物理内存.共享内存是进程间共享数据的一种最快方法,一个进程向共享内存写入了数据,共享这个内存的所有进程就可以立刻看到其中内容. 共享内存实现分为两个步骤 1.创建共享内存,使用shmget函数. 2.映射共享内存,将创建的这段共享内存映射到具体的进程空间去,使用shmat函数. int shmget(key_t key,int size,int shmflg) key标志共享内存的键值:O/IPC_PRIVATE.当key的取值为IPC/PRIVATE

linux_c开发(5-1)进程间通讯_进程间通讯概念

目的:为什么进程间需要通信? 1.数据传输 一个进程需要将他的数据发送给另外一个进程. 2.资源共享 多进程之间共享同样的资源. 3.通知事件 一个进程需要向另一个或一组进程发送消息,通知他们发生了某种事件. 4.进程控制 有些进程希望完全控制另一个进程的执行(eg:debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道他的状态改变. 发展: linux进程间通讯(IPC)由以下及部分发展而来: 1.UNIX间进程通讯 2.基于system v进程间通讯 3.POSIX进

进程间的通讯(IPC)方式

为什么要进行进程间的通讯(IPC (Inter-process communication)) 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到.通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程).资源共享:多个进程之间共享同样的资源.为了作到这一点,需要内核提供锁和同步机制.进程控制:有些进程希望完全控制另一个进程的执行

Android Studio创建AIDL文件并实现进程间通讯

在Android系统中,跨进程通信是非常普遍的事情,它用到了Binder机制处理进程之间的交互.Binder机制会开放一些接口给java层,供android开发工程师调用进程之间通信.这些接口android封装到了AIDL文件里,当我们项目用到跨进程通信时可以创建.aidl文件,.aidl文件可以协助我们达到跨进程的通信.下面简单介绍用AndroidStudio创建AIDL文件的过程. a.新建AIDL文件 1.项目文件夹右键---> new --->选择AIDL 2.自定义一个接口名称 3.

Android(IPC)进程间通讯1:详解Binder由来?

完整原文:http://tryenough.com/android-ipc1 Android开发的进程间通讯,整个Android的应用都依赖于binder做底层通信机制.而Linux中提供的进程间通讯方式并没有binder机制,那么android中为什么要单独创造这种通讯方式呢?带着这个问题,继续往下读. Linux中进程相关概念 Linux将系统内存划分成了 用户空间 和 内核空间 两部分: 用户空间 : 普通应用程序则运行在用户空间上,它们不能使用某些特定的系统功能,不能直接访问硬件,不能直

【进程间通讯与进程池】 -- 2019-08-11 18:46:25

原文: http://106.13.73.98/__/4/ 目录 一.队列 二.管道 三.进程间数据共享 四.进程池 进程间通讯:IPC(Inter-Process Communication) 一.队列: 队列:先进先出(First In First Out)简称 FIFO 栈:先进后出(First In Last Out)简称 FILO 1. multiprocessing.Queue模块 用于创建共享的进程队列,Queue是多进程安全的队列,可以实现对进程之间的数据传递,队列底层是使用管道