PIPE、SIGNAL(day11)
一、管道
管道分为两种: 无名管道 有名管道
无名管道用于具有亲缘关系的进程间通讯。无名管道是单工的。
有内核管理的一块内存空间。
使用管道,系统提供了pipe()
#include <unistd.h>
int pipe(int pipefd[]);
功能:创建管道
参数:
pipefd[]:用于返回管道的两端。pipefd[]指向管道的读端。
pipefd[]指向管道的写端。 返回值:
成功。
- 错误 errno被设置 使用管道实现两个进程间的通讯。
步骤:
(一)、父进程创建管道
(二)、父进程创建子进程(子进程继承了父进程的文件描述符)
(三)、父进程负责的工作
、关闭读端
、通过管道的写端文件描述符,写数据到管道空间。
、阻塞等待子进程的结束。子进程结束的时候,收尸 (四)、子进程负责的工作
、关闭写端
、从管道中读取数据
、将读取到的数据,输出到显示器
、结束进程。 代码的实现 pipe.c 有名管道
有名管道其实是一个文件,这个文件只能用于两个进程间通讯的桥梁。不存储任何数据内容。
如何创建一个有名管道的文件。使用mkfifo()
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
功能:创建一个有名管道文件
参数:
pathname:指定了有名管道文件的名字
mode:指定了管道文件的权限 mode & ~umask
返回值:
成功
- 错误 errno被设置 编码实现管道文件的创建。 文件名字由命令行第一个参数传入,权限为0664.
代码参见 mkfifo.c
编写代码向有名管道写数据。代码参见PA.c
编写代码实现从有名管道读取数据 代码参见PB.c 进程结束了。 尝试将管道添加到psh中 二、信号的基础
什么是信号?
信号就是软中断。
软中断就是软件模拟的中断机制。
中断又是什么?
正常的执行流程、中断处理程序 正常的执行流程、信号处理程序是两条执行路线,但是属于同一个进程。
系统为我们提供了哪些信号呢?
kill -l 信号有名字和编号。 信号的产生到消失的过程。
信号的产生、信号阻塞、信号递达进程、信号处理
信号的未决状态 就是信号产生了,但是信号还没有被进程处理,这期间,信号的状态为未决状态。 进程可以设置对信号的阻塞。 三、改变信号的处理函数
进程对信号的处理有默认动作。默认处理是终止进程。
除此之外,还有两种 忽略信号 用户自定义
进程从父进程继承信号处理函数。
SIG_DFL 默认
SIG_IGN 忽略
doit 用户自定义的信号处理函数 系统提供了signal() 用来改变信号的处理函数
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
功能:
参数:
signum:指定了信号的编号
handler:指定了signum信号的处理函数
SIG_IGN, SIG_DFL, 用户自定义函数
返回值:
SIG_ERR 错误
返回的是旧的信号处理函数的地址 typedef void (*sighandler_t)(int); 举例说明 编码实现进程忽略2号信号 代码参见signal2.c
编码实现进程对2号信号的处理采用用户自定义的函数。
代码参见 signal_2u.c 四、信号的产生
信号产生的三种形式:
、硬件产生信号 ctrl+c ctrl+\
、使用命令为进程发送信号 kill -信号编号 pid
、使用库函数或者系统调用为进程发送信号
kill()
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
功能:给一个进程发送信号
参数:
pid:指定了接收信号的进程的pid
sig:指定了具体的信号
返回值:
成功
- 错误 errno被设置 举例说明 编写代码实现kill命令的功能。代码参见pkill.c raise()
#include <signal.h>
int raise(int sig);
功能:发送信号给当前进程
参数:
sig:指定信号的编号
返回值:
成功
非0 错误 举例说明,使用raise给当前进程发送信号 代码参见 raise.c alarm() 产生SIGALRM信号
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
功能:产生SIGALRM信号,将这个信号发送给当前进程
参数:
seconds:指定了闹钟的时间。如果这个参数为0.取消闹钟。 返回值:
返回剩余的没执行的时间值。 举例说明 编写代码实现每一秒钟输出的数字。代码参见 count.c 五、信号阻塞和未决信号 信号集类型 sigset_t 系统对sigset_t 类型进行了封装 #include <signal.h>
int sigemptyset(sigset_t *set);
功能:初始化信号集为空,不包含任何信号
参数:
set:指定要初始化的信号集
返回值:
成功
- 错误 int sigfillset(sigset_t *set);
功能:初始化信号集为满,包含所有的信号
参数:
set:指定要初始化的信号集
返回值:
成功
- 错误 int sigaddset(sigset_t *set,int signum);
功能:添加指定的信号到信号集
参数:
set:指定信号集
signum:指定信号
返回值:
成功
- 错误 int sigdelset(sigset_t *set,int signum);
功能:从指定信号集删除指定的信号
参数:
set:指定信号集
signum:指定信号
返回值:
成功
- 错误 int sigismember(const sigset_t *set, int signum);
功能:测试信号是否是集合的一员
参数:
set:指定信号集
signum:指定信号
返回值:
- 错误
是
不是 通过sigprocmask()设置信号集为进程的屏蔽字。
#include <signal.h>
int sigprocmask(int how,const sigset_t *set,\
sigset_t *oldset);
功能:检查或者改变阻塞信号
参数:
how:
SIG_BLOCK:原来的set和set的并集
SIG_UNBLOCK:将set集合中的信号从当前进程的set中移除。
SIG_SETMASK:将set设置为当前进程的信号屏蔽字 set:新的信号屏蔽字。
oldset:保存进程原来的信号屏蔽字。如果为NULL,不保存。
返回值:
成功
- 错误 举例说明 编写代码实现对2号信号的阻塞。
代码参见 blocked2.c 多次发送2号信号,进程对2号信号阻塞,在解除阻塞的时候,信号处理函数只执行一次,造成了信号的丢失。这样的信号叫不可靠信号。 ~ ~ 称为可靠信号,不会有信号丢失。 检测进程的未决信号
sigpending()
#include <signal.h>
int sigpending(sigset_t *set);
功能:检测未决信号
参数:
set:未决信号掩码被存放在这个集合中
返回值:
成功
错误 - 举例说明 检测进程的未决信号集
代码参见 pending.c 总结:
一 管道 (无名管道 有名管道)
二、信号基础
三、信号的处理
signal()
四、信号的产生
五、信号阻塞和未决信号
PIPE、SIGNAL(day11)的更多相关文章
- Python 多线程、多进程 (三)之 线程进程对比、多进程
Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.多线程与多进 ...
- ROC 曲线/准确率、覆盖率(召回)、命中率、Specificity(负例的覆盖率)
欢迎关注博主主页,学习python视频资源 sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.ht ...
- SystemVerilog Assertion 设计、调试、测试总结(1)
暑期实习两个月的其中一个任务是:如何在设计中加入断言?以及断言的基本语法.三种应用场景下的断言(如FIFO.FSM.AXI4-lite总线).参考书籍:<System Verilog Asser ...
- 浅析匿名函数、lambda表达式、闭包(closure)区别与作用
浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...
- 设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。
一. 设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...
- Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)
Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...
- 2、C#面向对象:封装、继承、多态、String、集合、文件(上)
面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. ...
- Saltstack 介绍、安装、配置(一)
Slatstack 介绍 官网:https://saltstack.com/ 官方源:http://repo.saltstack.com/ (介绍各操作系统安装方法) http://repo.sal ...
- Hive介绍、安装(转)
1.Hive介绍 1.1 Hive介绍 Hive是一个基于Hadoop的开源数据仓库工具,用于存储和处理海量结构化数据.它是Facebook 2008年8月开源的一个数据仓库框架,提供了类似于SQL语 ...
随机推荐
- TRIZ的成功案例
这篇採訪稿是几年前的,是TRIZ成功案例离我近期的,由于主人公是我的朋友,请点击查看: 培训后技术难题就攻克了 后记:学了TRIZ并不能让您100%解决您全部遇到的问题,但这样的思想和方法确实是最具操 ...
- (七)CAS 本地localhost调试,无法单点退出疑问
干活的时候要多思考-------- 题记 昨天下午接到任务把内容汇聚平台和分发平台加上统一认证登录,之前弄过CAS,想想这个过程也就是按部就班的事情.在两个系统中we ...
- 使用memcachedclientXmemcached与Spring整合
1 简单介绍 Xmemcached是一个高性能的基于java nio的memcachedclient.在经过三个RC版本号后.正式公布1.10-final版本号. xmemcached特性一览: 1. ...
- 2本Hadoop技术内幕电子书百度网盘下载:深入理解MapReduce架构设计与实现原理、深入解析Hadoop Common和HDFS架构设计与实现原理
这是我收集的两本关于Hadoop的书,高清PDF版,在此和大家分享: 1.<Hadoop技术内幕:深入理解MapReduce架构设计与实现原理>董西成 著 机械工业出版社2013年5月出 ...
- The Elder HDU - 5956
/* 树上斜率优化 一开始想的是构造出一个序列 转化成一般的dp但是可能被卡 扫把状的树的话可能变成n*n 其实可以直接在树上维护这个单调队列 dfs虽然搞得是一棵树,但是每次都是dfs到的都是一个序 ...
- ubuntu如何完全卸载和安装 Java及android环境?【转】
本文转载自:https://my.oschina.net/lxrm/blog/110638 最近,迷上了java,一时间什么环境变量/虚拟机都猛然袭来,有点不适.环境配置在前,这所自然.平时搞PHP都 ...
- NOI 2009A 诗人小G
NOI 2009A 诗人小G 诗人小G [问题描述] 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们 ...
- 循环遍历Java字符串字符的规范方法——类似python for ch in string
比如我将string作为CNN 文本处理输入: float [] input = new float[maxLength]; // 1 sentence by maxLenWords // int[] ...
- JDK5.0新特性(静态导入、自动装箱/拆箱、增强for循环、可变参数、枚举、泛形)
JDK5中新增了很多新的java特性,利用这些新语法可以帮助开发人员编写出更加高效.清晰,安全的代码. 这些新特性主要有:1.静态导入2.自动装箱/拆箱3.增强for循环4.可变参数5.枚举6.泛型7 ...
- PCB Genesis脚本C#使用WPF窗体实现方法
用C#写脚本做UI界面基本上都是用WinForm界面,如果想制作很漂亮动态的界面用WPF界面挺不错的选择, 这里介绍如何使用控制台程序调用WPF窗口 一.方法一 在控制台程序中,通过Main方法启动W ...