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语 ...
随机推荐
- 南昌互联网行业协会筹办者祝真和华罡团队-2014年12月江西IDC排行榜
他出自军营,拥有一身正气. 他在南昌创业,立意卓越. 从站点開始.到微营销.到线上教育,全面开花. 他在朋友圈看到不对的内容,就会即时批评. 他对朋友,又是很的和蔼可亲. 他就是南昌华罡网络创办 ...
- Cocos2d-x飞机大战教程笔记
咳咳~跟着大神的教程学做Cocos2d-x的飞机大战...鉴于我是那种跟着教程都会出非常多错的人,所以还是一路跟着做些笔记比較好.并且因为是用课余时间,所以仅仅能断断续续地做,写下来也好让自己别忘记~ ...
- C++第11周(春)项目3 - 点类派生直线类
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759.内有完整教学方案及资源链接 [项目3 - 点类派生直线类]定义点类Poin ...
- C++学习笔记22,普通函数重载(1)
转载请注明出处:http://blog.csdn.net/qq844352155/article/details/31353325 该博文仅用于交流学习,请慎用于不论什么商业用途,本博主保留对该博文的 ...
- HDU5526/BestCoder Round #61 (div.1)1004 Lie 背包DP
Lie 问题描述 一个年级总共有N个学生,每个人属于唯一一个班级.现在他们站在一排,同班同学并不一定会站在一起,但每个人都会说一句话:“站在我左边的有Ai个同班同学,右边有Bi个同班同学”.然而并 ...
- luogu1268 树的重量
题目大意 给出一棵树上每两个叶子节点之间的距离,求树的总边权和. 题解 定义节点a到b的简单路径长度为[a,b],树中节点c要到达路径[a,b]所要经过的距离为dist(c, [a,b]),在树中,与 ...
- C# 文件的一些基本操作(转)//用C#读写ini配置文件
C# 文件的一些基本操作 2009-07-19 来自:博客园 字体大小:[大 中 小] 摘要:介绍C#对文件的一些基本操作,读写等. using System;using System.IO;us ...
- C#如何读写和创建INI文件(经典)转
C#如何读写和创建INI文件 分类: c#程序设计2011-11-27 20:42 4935人阅读 评论(2) 收藏 举报 inic#stringbuffernullfile 在做项目过程中,有时需要 ...
- hdu 4704(费马小定理+快速幂取模)
Sum Time Limit: 2000/ ...
- [Apple开发者帐户帮助]六、配置应用服务(1.2)Apple Pay:在网络上配置Apple Pay
网上Apple Pay允许用户在您的网络应用中购买商品和服务. 首先在您的开发者帐户中创建一个商家标识符,该标识符可以将Apple Pay唯一标识为能够接受付款的商家.您可以为多个本机和Web应用程序 ...