`

进程间通信学习笔记二(信号通信)

 
阅读更多

信号通信


用户按某些键时,产生信号
硬件异常产生信号
进程用kill函数将信号发送给另一个进程
可以用kill函数将信号发送给其他进程


信号的类型
1 sighup 从终端上发出的结束信号
2 sigint 来自键盘的中断信号(ctrl-c)
3 sigquit
4 sigill
5 sigtrap
6 sigiot
7 sigbus
8 sigfpe
9 sigkill 结束接收信号的进程
10 sigusr1
11 sigsegv
12 sigusr2
13 sigpipe
14 sigalrm
15 sigterm kill命令发出的信号
17 sigchld 标识子进程停止或结束的信号
18 sigcont
19 sigstop 来自键盘(crtl-z)或调试程序的停止执行信号
20 sigtstp
21 sigttin
22 sigttou
23 sigurg
24 sigxcpu
25 sigxfsz
26 sigvtalrm
27 sigprof
28 sigwinch
29 sigio
30 sigpwr


信号处理
当信号出现时,将按照下列三种方式中的一种进行处理:
1 忽略此信号
sigkill和sigstop这两种信号除外
2 执行用户希望的动作
3 执行系统默认动作


信号的发送


发送信号的主要函数有:
kill: 可以向自身发送信号,也可以向其他进程发送信号
raise:向进程自身发送信号
函数原型:
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid,int signo)
int raise(int signo)


alarm
使用alarm函数可以设置一个时间值,当设置时间到时,会产生一个sigalrm信号
如果不捕捉此信号,默认动作是终止该进程
注:每个进程只能有一个闹钟时间,当seconds值是0,表示取消以前的闹钟
函数原型:
#include <unistd.h>
unsigned int alarm(unsigned int seconds)
seconds:经过了指定的seconds秒后会产生信号sigalrm




pause
使调用进程挂起直至捕捉到一个信号
函数原型:
#include <unistd.h>
int pause(void)


信号的处理
1可以忽略该信号或是使用指定的处理函数来处理该信号,或者使用系统默认的方式
2 使用简单的signal函数,或是使用信号集函数组




signal
函数原型
#include <signal.h>
void (*signal(int signo,void(*func)(int)))(int)
func可能的值是:
sig_ing 忽略此信号
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 SIGNINT or SIGQUIT \n");
/*注册信号处理函数*/
signal(SIGINT,my_func);
signal(SIGQUIT,my_func);


pause();
exit(0);
}


编译执行:
[root@localhost app]# gcc mysignal.c -o mysignal
[root@localhost app]# ./mysignal
waiting for signal SIGNINT or SIGQUIT


打开另一终端
查看进程id
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 9837 0.0 0.0 1624 308 pts/1 S+ 02:38 0:00 ./mysignal


查看返回结果:
i have get SIGINT

分享到:
评论

相关推荐

    学习笔记信号量和进程间通信

    本学习笔记将深入探讨信号量和进程间通信的相关概念、原理以及实际应用。 首先,让我们理解什么是进程。进程是程序执行的实例,拥有独立的内存空间和系统资源,它们在操作系统中并行运行。在多进程环境中,为了协调...

    MFC教程lesson 17-进程间通信.rar

    在IT领域,MFC(Microsoft Foundation ...学习完这个教程后,开发者应该能够熟练地在MFC应用中实现进程间通信,从而提升程序的扩展性和协作性。对于想要深入理解和应用MFC的程序员来说,这是一个不可错过的章节。

    《ORANGE’S:一个操作系统的实现》读书笔记(二十四)进程间通信(二)文章代码

    《ORANGE’S:一个操作系统的实现》这本书深入浅出地介绍了操作系统的设计与实现,其中第24章主要探讨了进程间通信的第二部分。在这一章节中,作者可能会涉及多种IPC机制,包括管道、信号量、消息队列、共享内存等,...

    《ORANGE’S:一个操作系统的实现》读书笔记(二十五)进程间通信(三)文章代码

    在操作系统设计中,进程间通信(IPC,Inter-Process Communication)是至关重要的组成部分,它允许不同进程之间交换数据和同步状态。《ORANGE’S:一个操作系统的实现》这本书深入浅出地介绍了操作系统的设计与实现...

    操作系统学习笔记

    "信号处理"(Ch3_5_信号处理.doc)是操作系统中进程间通信的一种方式,用于异步通知进程发生了特定事件。信号可以用来中断进程、改变进程状态或者执行用户指定的操作。 最后,"ch4_x_管道.doc"应该讲解了进程间的另...

    进程同步——信号量机制

    关于信号量的文章,生产者消费者问题与读者写者问题---信号量机制,PV操作——进程同步的信号量问题,利用信号机制实现的 父子进程同步,嵌入式linux的学习笔记-进程间通信的信号与信号集(四)1)进程的同步与互斥 ...

    Linux 进程 线程学习笔记

    Linux提供了多种机制来实现进程间通信(IPC),包括信号、管道、消息队列、共享内存和信号量等。 #### 线程管理 在Linux中,线程的创建和管理主要通过`pthread`库实现,其中`pthread_create()`用于创建新线程,`...

    记录自己共享内存学习笔记

    记录自己共享内存学习笔记 共享内存是一种进程间通信方式,它允许多个进程共享同一块物理内存区域,以实现进程之间的信息交换。共享内存的原理是将同一块物理内存映射到多个进程的地址空间中,使得多个进程可以访问...

    ACE学习笔记总结和使用文档(资料比较多,整理了好长时间)

    ACE提供了一组丰富的可重用C++包装外观(wrapper facade)和构架组件,可跨多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、...

    linux学习笔记:进程

    5. **进程间的关系**: - **亲属关系**:包括`real_parent`(创建进程的父进程),`parent`(当前父进程),`children`(子进程链表),和`sibling`(兄弟进程链表)。 - **非亲属关系**:`group_leader`表示进程组的领导...

    linux内核设计与实现第二版 学习笔记

    在《Linux内核设计与实现》第二版的学习笔记中,我们可以深入探讨以下几个关键知识点: 1. **内核架构**:Linux内核采用微内核架构,主要由进程管理、内存管理、文件系统、设备驱动和网络协议栈等模块组成。这些...

    操作系统学习笔记(三)1

    本文主要探讨了操作系统中的进程与线程,以及进程间通信的基础概念。 一、进程 进程是操作系统中运行程序的实例,它包含了程序的代码、数据、状态信息等。一个进程在某一时刻可能处于运行、就绪、阻塞三种状态之一...

    跨进程自学资料与笔记

    1. 进程间通信(IPC, Inter-Process Communication):这是跨进程的核心,包括管道、共享内存、消息队列、套接字、命名管道等多种方式。每种方式都有其适用场景和优缺点,需要根据实际需求选择。 2. 同步与互斥:当...

    JAVA 多线程学习笔记

    这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...

    verilog学习笔记

    这篇“Verilog学习笔记”涵盖了VERILOG学习过程中的关键点和常见易错点,对初学者和有经验的工程师都具有很高的参考价值。 一、Verilog基础语法 Verilog的基础语法包括变量声明、操作符、赋值语句等。例如,变量...

    linux下C语言开发笔记整理

    信号是Unix/Linux系统中一种用于进程间通信的方法。C语言提供了处理信号的标准API,如`signal`函数用于设置信号处理函数。 ### Unix/Linux系统的进程间通信 进程间通信(IPC)允许独立的进程交换数据,常见的IPC...

    linux c书本学习以及自己的学习笔记

    - 管道和FIFO:了解进程间通信(IPC)方式,如管道和命名管道(FIFO)的使用。 - 线程:掌握pthread库,包括线程的创建、同步和通信。 5. **信号处理**: - 信号:理解Linux中的信号机制,如何注册信号处理函数...

    数据库系统工程师学习笔记

    根据给定的文件信息,以下是对“数据库系统工程师学习笔记”的详细知识点整理: ### 数据库系统工程师学习笔记 #### 1. 计算机发展简史 - **大型机(Mainframe)时期**:始于1946年,标志性的机器如ENIAC等,后续...

    linux编程学习笔记PDF资料下载.txt

    - **进程间通信(IPC)**:Linux提供了多种进程间通信机制,如管道、消息队列、共享内存、信号量等。 - **线程编程**:多线程编程可以利用多核处理器的并行计算能力,提高程序的执行效率。 - **同步与互斥**:为了...

Global site tag (gtag.js) - Google Analytics