一、管道
管道分为两种: 无名管道 有名管道
无名管道用于具有亲缘关系的进程间通讯。无名管道是单工的。
有内核管理的一块内存空间。
使用管道,系统提供了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)的更多相关文章

  1. Python 多线程、多进程 (三)之 线程进程对比、多进程

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.多线程与多进 ...

  2. ROC 曲线/准确率、覆盖率(召回)、命中率、Specificity(负例的覆盖率)

      欢迎关注博主主页,学习python视频资源 sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.ht ...

  3. SystemVerilog Assertion 设计、调试、测试总结(1)

    暑期实习两个月的其中一个任务是:如何在设计中加入断言?以及断言的基本语法.三种应用场景下的断言(如FIFO.FSM.AXI4-lite总线).参考书籍:<System Verilog Asser ...

  4. 浅析匿名函数、lambda表达式、闭包(closure)区别与作用

    浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...

  5. 设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

  6. Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)

    Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...

  7. 2、C#面向对象:封装、继承、多态、String、集合、文件(上)

    面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. ...

  8. Saltstack 介绍、安装、配置(一)

    Slatstack 介绍 官网:https://saltstack.com/ 官方源:http://repo.saltstack.com/  (介绍各操作系统安装方法) http://repo.sal ...

  9. Hive介绍、安装(转)

    1.Hive介绍 1.1 Hive介绍 Hive是一个基于Hadoop的开源数据仓库工具,用于存储和处理海量结构化数据.它是Facebook 2008年8月开源的一个数据仓库框架,提供了类似于SQL语 ...

随机推荐

  1. getAttribute for IE7

    getAttribute 大部分介绍都说仅仅有一个.包含w3cschool. 事实上这种方法在iE7下有两个參数. msdn 上查到的. 简单翻一下 0 是默认情况,不区分大写和小写! 1 区分大写和 ...

  2. Hadoop - YARN 启动流程

       一  YARN的启动流程                                                                 watermark/2/text/aHR ...

  3. C++ 句柄类的原理以及设计

    句柄类存在的意义是为了弥补将派生类对象赋给基类对象时发生的切片效应.比如以下的程序: multimap<Base> basket; Base base; Derived derive; b ...

  4. Android 输入管理服务-输入事件到达之后的处理流程

    接上一篇博客"Android 输入管理服务启动过程的流程".这两天分析了Android 输入管理服务接收到输入事件之后的处理流程,详细流程例如以下面两图所看到的: 接下图

  5. DNS隐蔽通道 是可以通过dig 子域名来追踪其真实IP的

    比如a.friendskaka.com 是我的外发子域名,那么可以按照下面两个命令来追踪IP: bonelee@bonelee-VirtualBox:~/桌面$ dig auth.a.friendsk ...

  6. Stockbroker Grapevine(floyd)

    http://poj.org/problem?id=1125 题意: 首先,题目可能有多组测试数据,每个测试数据的第一行为经纪人数量N(当N=0时, 输入数据结束),然后接下来N行描述第i(1< ...

  7. ROS-TF-监听

    前言:监听第一只海龟的位置,然后让第二只海龟跟随第一只海龟. 通过监听tf,我们可以避免繁琐的旋转矩阵的计算,而直接获取我们需要的相关信息. 一.新建cpp文件 新建turtle_tf_listene ...

  8. angularJS之ng-bind与{{}}取值的区别

    1:{{ }} 是等页面加载完后,再取值. 2:ng-bind 它是在页面加载的时候,是不会显示{{name}}这种变量出来. 3:ng-bind 可以解决 ng 页面闪烁加载问题. 4:ng-bin ...

  9. .htaccess的基本用法与介绍

    ●自定义错误页 .htaccess的一个应用是自定义错误页面,这将使你可以拥有自己的.个性化的错误页面(例如找不到文件时),而不是你的服务商提供的错误页或没有任何页面.这会让你的网站在出错的时候看上去 ...

  10. 关于AS使用git的那些奇葩事儿

    首先致谢: http://blog.csdn.net/a10615/article/details/52135617, 我们不生产代码, 我们只做大自然的搬运工! 总结 1. 首次无法push问题: ...