| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> linux IPC-管道和FIFO -> 正文阅读 |
|
[系统运维]linux IPC-管道和FIFO |
目录 1、管道管道没有名字,只能由有亲缘关系的进程使用。 注:从技术上上讲,自从可以在进程间传递描述符后,管道也能用于无亲缘关系的进程间。然而现实中,管道通常用于具有共同祖先的进程间。 宏S_ISFIFO可用于确定一个描述符或文件是是不是FIFO.它的唯一参数是stat结构的st_mode成员,计算结果或者为真(非零值),或者为假(0),对于管道来说,这个stat结构是fstat函数填写的。对于FIFO来说,这个结构是由fstat或stat函数填写的。 管道是半双工的即单向的,只提供一个方向的数据流。当需要双向数据流时,必须创建两个管道,每个方向一个。步骤如下: 1)创建管道1(fd1[0]和fd1[1])和管道2(fd2[0]和fd2[1]) 2) fork 3)父进程关闭管道1的读出端 4)父进程关闭管道2的写入端 5)子进程关闭管道1的写入端 6)子进程关闭管道2的读出端 1.1、pipe()函数
参数 fd:fd[0]读,fd[1]写 1.2、popen()函数popen在调用进程和所指定的命令之间创建一个管道。
参数?command:一个shell命令行。 参数?type:类型
返回值:一个标准I/O FILE指针,该指针或者用于输入,或者用于输出,取决于type。 注:popen不对标准错误输出作任何特殊的处理-只有标准输出才被重定向到由它创建的管道。 1.3、pclose()函数关闭由popen()创建的I/O流,等待其中的命令终止,然后返回shell的终止状态。
参数?stream:popen()创建的I/O流 返回值:失败返回-1,并设置错误码。 1.4、system函数使用 system函数可以很方便地在程序当中执行任意 shell 命令。system函数其内部的是通过调用 fork()、execl()以及 waitpid()这三个函数来实现它的功能, 首先 system函数会调用 fork函数创建一个子进程来运行 shell(可以把这个子进程成为 shell 进程) ,并通过 shell 执行参数command 所指定的命令。 函数原型如下:
参数 command:指向需要执行的 shell 命令,以字符串的形式提供, 1) 当参数 command 为 NULL, 如果 shell 可用则返回一个非 0 值,若不可用则返回 0;针对一些非UNIX 系统,该系统上可能是没有 shell ,这样就会导致 shell 不可能; 2)如果 command 参数不为NULL,则返回值从以下的各种情况所决定。 1.5、popen与system区别1)popen是不堵塞的,也就是说不会等待子进程的结束并杀死子进程,即不会管理进程。这样就需要我们手动的去杀死或忽略子进程等操作。 system是堵塞的,会自动对进程进行管理,无需我们再去对进程进行管理。 2)popen会将执行的结果返回到buf中。另外,system不会返回执行的结果,只是会返回执行是否成功。 注:linux尽量避免使用system。 2、FIFO(有名管道)不同于管道的是,每个FIFO有一个路径名与之关联,从而允许无亲缘关系的进程访问同一个FIFO。 注:对管道或FIFO的write总是往末尾添加数据,对它们的read则总是从开头返回数据。如果对管道或FIFO调用lseek,那就返回ESPIPE错误。 2.1、mkfifo()函数要打开一个已存在的FIFO或创建一个新的FIFO,应先调用mkfifo,再检查它是否返回EEXIST错误,若返回错误则改为调用open。 注:mkfifo隐含指定O_CREAT|O_EXCL.如果不希望创建一个新的FIFO,那就改为调用open而不是mkefifo。
参数 pathname:一个普通的路径名。 参数 mode:指定文件权限位,类似于open的第二个参数。 返回值:成功返回0,出错返回-1,并设置错误码。 注:FIFO不能打开来既读又写,因为它是半双工的。 2.2、FIFO与NFS的关系FIFO是一种只能在单台主机上使用的IPC形式。尽管在文件系统中有名字,它们也只能用在本地文件系统上,而不能用在通过NFS安装的文件系统上。 有些系统允许在通过NFS安装的文件系统上创建FIFO,但是数据无法在这样的两个系统间通过这些FIFO传递。这种情况下,FIFO只是用作同一主机上客户和服务器之间位于文件系统中的集结点。即使在不同主机上的某两个进程都能通过NFS打开同一个FIFO,它们也不能通过该FIFO从一个进程向另一个进程发送数据。 3、管道和FIFO的额外属性当对一个管道或FIFO的最终close发送时,该管道或FIFO的任何残余数据都被丢弃。
1)如果请求写入的数据的字节数小于或等于PIPE_BUF,那么write操作保证是原子的(如果请求写入的数据字节数大于PIPE_BUF,那么write操作不能保证是原子的) 2)O_NONBLOCK标志的设置对write操作的原子性没有影响--原子性完全是由所请求字节是否小于等于PIPE_BUF决定的。当设置为非阻塞时,来自write的返回值取决于待写的字节数以及该管道或FIFO中当前可用空间的大小。
3)如果向一个没有为读打开着的管道或FIFO写入,那么内核将产生一个SIGPIPE信号。
4、管道和FIFO限制
4.1、查看限制1)ulimit? 2)?getcon
3)运行时获取
5、字节流I/O模型管道和FIFO都使用字节流I/O模型,这种模型不存在记录边界。 1)带内特殊终止序列。这种技巧一般要求数据中任何出现分隔符处都作转义处理。 2)显示长度。这种技巧的优势之一是不再需要通过转义出现在数据中的分隔符,因为接收者不必扫描整个数据以寻找每个记录的结束位置。 3)每次连接一个记录:应用通过关闭与其对端的连接来指示一个记录的结束。这要求为每个记录创建一个新连接。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 16:56:15- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |