linux io 学习笔记(02)---条件变量,管道,信号
条件变量的工作原理:对当前不访问共享资源的任务,直接执行睡眠处理,如果此时需要某个任务访问资源,直接将该任务唤醒。条件变量类似异步通信,操作的核心:睡眠、唤醒。
1.pthread_cond_t 定义条件变量
2.初始化条件变量
函数原型:int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);
功能 :初始化条件变量
参数:cond 条件变量标识符
addr 属性
返回值:成功 :0;失败:错误码
3.休眠
函数原型:int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);
功能: 任务执行睡眠。执行睡眠之前,必须执行上锁
参数: cond 条件变量标识符
mutex 互斥锁标识符
返回值: 成功: 0;失败:错误码
4.执行唤醒操作
函数原型:int pthrerad_cond_signal(pthread_cond_t *cond);
功能:执行唤醒操作
参数:cond 条件变量标识符
返回值: 成功 0;失败:错误码
5.摧毁条件变量
函数原型:int pthread_cond_destroy(pthread_cond_t *cond);
功能: 摧毁条件变量
参数: cond 条件变量标识符
返回值:成功:0;失败 :错误码。
注意:在睡眠之前,执行上锁处理,将睡眠操作锁住,在线程执行睡眠的时候,不会被打断。
pthread_mutex_lock(&lock);
线程睡眠,函数阻塞,函数 自动 释放锁资源,此时线程得到唤醒信号,pthread_cond_wait立刻返回,有阻塞编程非阻塞,pthread_cond_wait立刻自动执行上锁处理
pthread_cond_wait(&cond,&lock);
注意: 唤醒操作发生在睡眠之前,则唤醒操作无效。所以,发送信号一定要咋睡眠之后。
printf("buf=%s\n",buf); 临界区
pthread_mutex_unlock(&lock); 解锁处理
无名管道:
1.要点:
1)只能用于具有亲缘关系的进程之间的通信
2)半双工的通信方式,具有固定的读端和写端
3)管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read/write函数
4)无名管道的操作属于一次性操作,如果对无名管道执行读操作,数据就会被读走(类似剪切的方式)
5)无名管道管道的大小是固定的,管道一旦写满,写操作就会阻塞,管道的大小为64K
6)当管道中无数据,执行读操作,读操作阻塞
7)无名管道写满,写操作阻塞,如果管道中有大于4k的空间,写操作就可以继续,每次最多写入4k的整数倍
8)无名管道不保证操作的原子性,如果当前管道,满足读写条件,读写可以并发。
9)向无名管道中写数据,将读端关闭,管道损坏,进程收到信号(SIGPIPE)将进程退出
10)当管道中有数据,将写端关闭,读操作可以执行,之后数据读完,可以继续读取(非阻塞)
2.创建无名管道:
函数原型:int pipe(int pipefd[2]);
功能 :创建无名管道
参数: pipefd[2] 保存的是操作管道的两个文件描述符
pipefd[1]管道的写端
pipefd[0]管道的读端
返回值:成功 0;失败:-1;
有名管道:
1.要点
1)有名管道可以使互不相关的两个进程互相通信。
2)有名管道可以通过路径名来指出,并且在文件系统中可见
(文件系统:提供文件维护的机制)
3)进程通过文件IO来操作有名管道
4)有名管道遵循先进先出规则
5)不支持如LSEEK()操作
6)有名管道:先创建,再打开。
2.相关函数
1)创建有名管道
函数原型:int mkfifo(const char *pathname,mode_t mode);
功能 :创建有名管道
参数 :pathname 路径名(管道名)
mode 文件所属用户的执行权限
返回值:成功:0 ;失败 -1
信号:
1.要点
信号是一种异步通信机制,信号可以直接进行用户空间进程和内核进程之间的交互
内核进程也可以利用它来通知用户空间进程发生了那些系统事件
用户进程对信号的相应方式:
1.忽略信号:对信号不做任何处理,但是有两个信号不能忽略:SIGKILL和 SIGSTOP
2捕捉信号:用户自定义信号处理函数,当信号发生时,执行相应的处理函数。
3.执行默认操作:Linux对每种信号都规定了默认操作
可用 kill -l 查看当前linux可用的信号
2.相关函数
1)注册信号
函数原型:type void (*sighandler_t(int)); == typedef void(*)sighandler_t;
sighandler_t signal(int signum,sighandler_t handler);
功能 :注册信号
参数 :signum 注册信号的类型
handler 对注册信号的处理,自定义函数:执行捕捉信号
SIG_IGN 忽略信号
SIG_DFL 执行信号的默认操作
返回值:失败:SIG_ERR
2)想进城或进程组发送任何一个信号
函数原型:int kill(pid_t pid,int sig);
功能 :向进程或进程组发送任何一个信号
参数 :pid 》0 指定进程号进行发送
= 0 信号发送给与调用进程在同一个进程组下的所有进程
-1 信号发送给当前进程允许发送的任何一个进程(init进程)
<-1 信号发送个进程组ID等于-PID下的任何一个进程
sig 发送信号的类型
3)给调用进程发送信号
函数原型:int raise(int sig);
功能:给调用进程发送信号
参数:sig 信号的类型
4)函数时钟设置
函数原型:unsigned int alarm(unsigned int seconds);
参数: sec 秒数(从设置时钟开始,到sec秒之后,进程收到信号SIGALRM,进程退出)
返回值: 成功 0
在alarm 之后,在次执行alarm,新的时钟将会替换上一次时钟设置,开始以新的时钟开始计时
会返回上一次执行ALARM到当前执行ALARM剩余的时间。
linux io 学习笔记(02)---条件变量,管道,信号的更多相关文章
- linux io 学习笔记(03)---共享内存,信号灯,消息队列
system V IPC 1)消息队列 2)共享内存 3)信号灯(信号量集) 1.消息队列. ipcs -q 查看系统中使用消息队列的情况 ipcrm -q +msqid 删除消息队列 消息队列工作原 ...
- linux io 学习笔记(01)---锁,信号量
1.采用信号量访问:当有段临界代码,需要保证排他的访问一个资源. 2.sudo dmesg -c 消除dmesg缓冲 3.互斥锁:代表的是一种锁资源,互斥锁的工作原理是:保证对共享资源操作的原子性 ...
- 尚硅谷韩顺平Linux教程学习笔记
目录 尚硅谷韩顺平Linux教程学习笔记 写在前面 虚拟机 Linux目录结构 远程登录Linux系统 vi和vim编辑器 关机.重启和用户登录注销 用户管理 实用指令 组管理和权限管理 定时任务调度 ...
- linux 驱动学习笔记01--Linux 内核的编译
由于用的学习材料是<linux设备驱动开发详解(第二版)>,所以linux驱动学习笔记大部分文字描述来自于这本书,学习笔记系列用于自己学习理解的一种查阅和复习方式. #make confi ...
- Linux系统学习笔记:文件I/O
Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...
- Linux内核学习笔记-2.进程管理
原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Linux内核学习笔记-1.简介和入门
原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Java IO学习笔记总结
Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 InputStreamReader和OutputStreamW ...
- Java IO学习笔记一
Java IO学习笔记一 File File是文件和目录路径名的抽象表示形式,总的来说就是java创建删除文件目录的一个类库,但是作用不仅仅于此,详细见官方文档 构造函数 File(File pare ...
随机推荐
- x86 分页机制——虚拟地址到物理地址寻址
x86下的分页机制有一个特点:PAE模式 PAE模式 物理地址扩展,是基于x86 的服务器的一种功能,它使运行 Windows Server 2003, Enterprise Edition 和 Wi ...
- 【LaTeX】E喵的LaTeX新手入门教程(3)
[LaTeX]E喵的LaTeX新手入门教程(3) 数学公式作者: 郭英东.sty 昨天熄灯了真是坑爹.前情回顾 [LaTeX]E喵的LaTeX新手入门教程(1)准备篇 [LaTeX]E喵的LaTeX新 ...
- 一、OSI模型
OSI/RM协议是由ISO(国际标准化组织)制定的,它有三个基本的功能:提供给开发者一个必须的.通用的概念以便开发完善.可以用来解释连接不同系统的框架.OSI将计算机网络体系结构(architectu ...
- @Modules( ... ) 多个包路径问题
如何支持多个包路径,modules不在同一个报名下 @Modules(scanPackage = true, packages = "cn.wizzer.modules, com.xxx.m ...
- swift 协议(结合扩展)的特点
协议的传统实现: 定义接口+实现协议 由抽象到具体: 协议的逆向实现(使用扩展): 由已存在的类型抽离部分功能作为协议,并让原体符合协议: 由具体到抽象: 向上抽离: 向上生成: 协议的缺省 ...
- struts2+extjs文件上传完整实现(攻克了上传中的各种问题)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/shanhuhau/article/details/28617999 首先须要引入上传控件 <s ...
- Java读取classpath下的文件
写Java程序时会经常从classpath下读取文件,是时候该整理一下了,并在不断深入的过程中,陆续补充上. 现在Java project 都以maven项目居多, 比如像下面这样的一个项目结构: 编 ...
- SpringMVC学习记录二——非注解和注解的处理器映射器和适配器
3 非注解的处理器映射器和适配器 3.1 非注解的处理器映射器 处理器映射器: org.springframework.web.servlet.handler.BeanNameUr ...
- 运行出现Server Tomcat v8.5 Server at localhost failed to start.和A child container failed during start
出现问题: 解决方法: 1.看servlet文件中的@WebServlet“()”,里面是否少了/字符,如图: 加上即可,有问题随时留言,欢迎您的咨询!
- grunt_beginner
前端集成解决方案:一套包含框架 和 工具,便于开发者快速构建美丽实用的web应用程序的工作流,同时 这套工作流必须是稳健强壮的. Yeman Bower web包管理器 框架.库.公共部分 Grunt ...