1、管道

pipe函数创建单向数据流

#include <unistd.h>
int pipe(int fd[2]);

成功返回0,失败返回-1

该函数返回两个文件描述字:fd[0]和fd[1],fd[0]打开来读,fd[1]打开来写

用途时提供两个不同进程(一个是父进程,一个是子进程)间的通信手段。首先,由一个进程(父进程)创建一个管道后调用fork派生一个自身的拷贝

2、popen和pclose

popen创建一个管道并启动另外一个进程,该进程或者从该管道中读出标准输入,或者往该管道写入标准输出

#include <stdio.h>
FILE *popen(const char *command, const char *type);

成功返回文件指针,失败返回NULL

int pclose(FILE *stream);

成功返回shell的终止状态,失败返回-1

command是shell命令行。popen在调用进程和所指定的命令之间创建一个管道。由popen返回的值是一个标准I/O FILE指针,该指针或者用于输入,或者用于输出,具体取决于字符串type

如果type为r,调用进程读进command的标准输出

如果type为w,调用进程写到command的标准输入

3、FIFO

无亲缘关系的进程可以用它创建彼此间的管道。是一个单向(半双工)数据流,每个FIFO有一个路径名与之关联,也称作有名管道。FIFO用mkfifio函数创建,其函数原型为

#include <sys/types.h>
#include <sys/stat.h>

int  mkfifo(const char *pathname, mode_t mode);

成功返回0,失败返回-1

pathname是一个普通的Unix路径名,它是该FIFO的名字

mode参数指定文件权限位,类似于open的第三个参数。定义在<sys/stat.h>头文件中的用于给一个FIFO指定权限位的6个常值

mkfifo函数已隐含指定O_CREAT|O_EXCL。也就是说,它要么创建一个新的FIFO,要么返回一个EEXIST错误。如果不希望创建一个新的FIFO,就改为open。

FIFO不能打开既读又写,因为它是半双工的。对管道或FIFO的write总是往末尾添加数据,read则总是从开头返回数据,如果对管道或FIFO调用lseek,返回ESPIPE错误

管道在将它打开着的进程中最后一个关闭它之后自动消失,FIFO的名字只有通过调用 unlink才从文件系统中删除

使用FIFO的顺序很微妙,如果当前尚没有任何进程打开某个FIFO来写,那么打开该FIFO来读的进程将阻塞

4、管道和FIFO的额外属性

设置非阻塞方式的两种方式

(1)调用open指定O_NONBLOCK标志

(2)如果描述字已经打开,调用fcntl使能O_NONBLOCK

非阻塞标志对于打开一个FIFO的影响、对于从一个空管道或空FIFO读出数据的影响以及对于往一个管道或FIFO写入数据的影响:

读出或写入的几个规则:

(1)如果请求读出的数据量多于管道或FIFO中当前可用数据量,只返回这些可用的数据。但是必须处理来自read的小于所请求数目的返回值

(2)如果请求写入的数据的字节数小于或等于PIPE_BUF,那么write操作保证是原子的。如果请求写入的字节数大于PIPE_BUF,那么write操作不能保证是原子 的

(3)O_NONBLOCK标志的设置对于write的原子操作没有影响--原子性操作完全是由所请求字节数是否小于等于PIPE_BUF决定的。然而当一个管道或FIFO设置成非阻塞时,来自write的返回值取决于待写的字节数以及该管道或FIFO中当前可有空间的大小。

如果待写的字节数小于等于PIPE_BUF:

(a)如果管道或FIFO中有足以存放请求字节数据的空间,那么所有数据字节都写入

(b)如果管道或FIFO中没有足以存放所请求字节数的空间,那么立即返回一个EAGAIN错误

如果待写的字节数大于PIPE_BUF:

(a)如果管道或FIFO中至少有一个字节空间,内核写入能容纳的数据字节,该数目同时作为来来自write的返回值

(b)如果管道或FIFO已满,立即返回EAGAIN错误

如果写入一个没有打开着用于读的管道或FIFO,将产生一个SIGPIPE信号

(a)如果调用进程既没有捕获也没有忽略SIGPIPE信号,缺省行为是终止该进程

(b)如果进程忽略SIGPIPE信号或捕获该信号并从信号处理程序返回,write返回一个EPIPE错误

5、管道和FIFO限制

加于管道和FIFO的唯一限制:

OPEN_MAX:一个进程在任意进户可以打开的最大描述字

PIPE_BUF:可原子地写往一个管道或FIFO的最大数据量

进程通信学习笔记(管道)相关推荐

  1. linux一个进程通知另外一个进程,Linux进程通信学习笔记

    一.为什么需要进程通信 1)数据传输 一个进程需要把它的数据发送给另一个进程. 2)资源共享 多个进程之间共享同样的资源. 3)通知事件 一个进程向另外一个进程发送消息,通知它发生了某事件. 4)进程 ...

  2. 进程通信学习笔记(Posix消息队列)

    在某个进程往一个队列写入消息之前,并不需要另外有个进程在该队列上等待消息的到达,这跟管道和FIFO是相反的,对于后两者来说,除非读出者已存在,否则先有写入者是没有意义的 1.mq_open.mq_cl ...

  3. 进程通信学习笔记(记录上锁)

    Posix fcntl记录上锁 记录上锁的Posix接口是fcntl函数 #include <fcntl.h> int fcntl(int fd, int cmd, .../* struc ...

  4. 进程通信学习笔记(读写锁)

    读写锁的分配规则: 1.只要没有线程持有某个给定的读写锁用于写,那么任意数目的线程可以持有读写锁用于读 2.仅当没有线程持有某个给定的读写锁用于读或用于写时,才能分配该读写锁用于写 这种对于某个给定资 ...

  5. 进程通信学习笔记(互斥锁和条件变量)

    1.互斥锁:上锁和解锁 Posix互斥锁作为数据类型pthread_mutex_t的变量声明.如果互斥锁变量是静态分配的,那么可以把它初始化成常值PTHREAD_MUTEX_INITIALIZER.如 ...

  6. 进程通信学习笔记(System V消息队列)

    跟Posix消息队列一样,不存在这样的要求:某个进程往一个队列中写入一个消息,另外一个进程下在等待该队列上一个消息的到达 系统中的消息队列,定义在<sys/msg.h>头文件中的信息结构: ...

  7. 进程通信之二 管道技术第二篇 匿名管道

    上一篇<进程通信之二 管道技术第一篇 输入输出的重定向>示范了增加若干程序代码来完成程序输入输出的重定向,并提出了如果没有程序源代码,只有程序文件如何来完成重定向.本篇就介绍如何使用匿名管 ...

  8. Linux进程线程学习笔记:运行新程序

    Linux进程线程学习笔记:运行新程序 周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下文并接着运行父进程中的代码,如果我们使新进程不运行原父进程的代码,转而运行另外一 ...

  9. STM32 CAN总线通信学习笔记(一)

    STM32 CAN总线通信学习笔记(一) 一.CAN总线简介 CAN 是控制器局域网络(Controller Area Network, CAN)的简称.CAN采用数据块编码的方式,数据块根据帧的类型 ...

最新文章

  1. 多项式求和_JAVA
  2. 【科普】五分钟快速了解代码复杂度
  3. Leetcode 2 两数相加 Python
  4. 前端学习(2518):生命周期钩子
  5. python3.8使用方法_python3.8新特性
  6. 搜狗输入法电脑版_搜狗输入法Mac版更新:找不到哪里下载?看这里
  7. python requests请求终止_Requests 如何中断请求?
  8. arm 大端还是小端_用C/C++带您了解计算机中大端小端之谜
  9. android网络框架
  10. C++::My Effective C++ (二)
  11. 简单使用Spring Boot+JpaRepository+hibernate搭建项目
  12. https的安装(基于阿里云)
  13. wordpress数据库表结构
  14. 视频教程-DelphiXE10安卓开发(实战篇)-其他
  15. flask-uploads文件上传
  16. 太原市山大附中2021年高考成绩查询,太原40所高中高考喜报汇总!
  17. python自己制作节奏大师游戏_十分钟利用Python制作属于你自己的个性logo
  18. tomcat启动异常:A child container failed during start
  19. 数据科学入门与细分数据领域盘点
  20. 计算机本科 很多很多科目的总结

热门文章

  1. iOS7以下设备获取mac地址
  2. power designer 设计数据库生成到oracle数据库
  3. 基于MIPS架构的BackTrace实现
  4. 关于android Activity生命周期的说明
  5. python使用缩进来体现代码之间的逻辑关系-Python 使用缩进来体现代码之间的逻辑关系 ....
  6. python与人工智能编程-python学习(一)——python与人工智能
  7. winpython使用教程-Win系统PyQt5安装和使用教程
  8. python程序设计报告-20192116 实验一《Python程序设计》实验报告
  9. python使用del保留字定义一个函数-python中自定义函数的保留字是
  10. python 数据分析学什么-利用Python做数据分析 需要学习哪些知识