linux系统编程之管道(三)
今天继续研究管道的内容,这次主要是研究一下命名管道,以及与之前学过的匿名管道的区别,话不多说,进入正题:


所以说,我们要知道命名管道的作用,可以进行毫无关系的两个进程间进行通讯,这是匿名管道所无法实现的。

下面来用命令创建一下:

用程序来创建:

另外管道文件是一种特珠类型的文件,所以不能用vim去像文本文件去编辑


也可以能过man帮助来查看到:



下面用一个实际的例子来说明下:

编译运行:

可以看到,此时运行已经被阻塞了,这时,我们来写一个往有名管道中写数据的程序,看看是否能解除阻塞?


这时,两个程序都来运行,先运行读操作的,再运行写操作的,看效果:

当有写进程打开该管道时,那么读进程就会由阻塞返回,也就论证了“O_NONBLOCK disable:阻塞直到有相应进程为写而打开该FIFO”。


”。下面来看一下写操作的规则:

int main(int argc, char *argv[])
{
int fd;
fd = open("p1", O_RDONLY); if (fd == -)
ERR_EXIT("open error"); printf("open succ\n");
return ;
}
int main(int argc, char *argv[])
{
int fd;
fd = open("p1", O_WRONLY);
if (fd == -)
ERR_EXIT("open error"); printf("open succ\n");
return ;
}
编译运行:


效果跟先运行读操作一样,这就论证了第一条:“O_NONBLOCK disable:阻塞直到有相应进程为读而打开该FIFO”。下面来看一下非阻塞的情况:

编译运行:

所以就论证了:“O_NONBLOCK enable:立刻返回失败,错误码为ENXIO”。
以上就对有名管道的打开规则进行了说明,下面以一个实例的例子来加深对有名管道用法的认识。因为有名管道是可以不相关的两个进程之间传递数据,所以下面的这个例子是一个进程往管道中写入文件Makefile,然后另外一个进程从管道中读取Makefile并写入到Makefile2,也就变向的进行了文件的拷贝操作,具体代码如下:

写文件代码:
#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <fcntl.h> #include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <sys/time.h> #define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while() int main(int argc, char *argv[])
{
mkfifo("tp", );//创建一个管道文件
int infd;
infd = open("Makefile", O_RDONLY);//打开Makefile文件
if (infd == -)
ERR_EXIT("open"); int outfd;
outfd = open("tp", O_WRONLY);//以写的方式打开管道,准备往里面写数据
if (outfd == -)
ERR_EXIT("open"); char buf[];
int n;
while ((n=read(infd, buf, ))>)//将Makefile文件的内容写入到有名管道中
{
write(outfd, buf, n);
}
close(infd);
close(outfd);
return ;
}
读文件并创建文件代码:
#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <fcntl.h> #include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <sys/time.h> #define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while() int main(int argc, char *argv[])
{
int outfd;
outfd = open("Makefile2", O_WRONLY | O_CREAT | O_TRUNC, );//本地创建一个Makefile2文件
if (outfd == -)
ERR_EXIT("open"); int infd;
infd = open("tp", O_RDONLY);//以只读的方式打开本地有名管道
if (outfd == -)
ERR_EXIT("open"); char buf[];
int n;
while ((n=read(infd, buf, ))>)//将管道中的数据写入到新创建的Mkaefile2文件以变向实现了文件的拷贝操作
{
write(outfd, buf, n);
}
close(infd);
close(outfd);
unlink("tp");//删除创建的管道文件
return ;
}
这时来运行来看下效果:
先运行写端:

再运行读端,将管道中的文件读入到新的一个文件:

这时,来查看下结果:

并且可以看到,创建的tp临时管道也被删除了,所以通过有名命道就实现了一个数据拷贝的功能,好了,关于管道的知识就先到这,接下来会用一个综合性的例子,来将linux系统编程的所有知识进行一个综合使用,下节再见!!
linux系统编程之管道(三)的更多相关文章
- linux系统编程之管道(三):命令管道(FIFO)
一,匿名管道PIPE局限性 管道的主要局限性正体现在它的特点上: 只支持单向数据流: 只能用于具有亲缘关系的进程之间: 没有名字: 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配 ...
- linux系统编程之管道(二):管道读写规则
一,管道读写规则 当没有数据可读时 O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止. O_NONBLOCK enable:read调用返回-1,errn ...
- linux系统编程之管道(一):匿名管道(pipe)
一,什么是管道 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道: 只能用于父子进程或者兄弟进程之间(具有 ...
- Linux系统编程—有名管道
▋****1. 管道的概念 管道,又名「无名管理」,或「匿名管道」,管道是一种非常基本,也是使用非常频繁的IPC方式. 1.1 管道本质 管道的本质也是一种文件,不过是伪文件,实际上是一块内核缓冲区, ...
- linux系统编程之管道(二)
今天继续研究管道,话不多说,言归正传: 对于管道,有一定的读写规则,所以这里主要是对它的规则进行探讨,具体规则如下: 规则一: 下面用程序来验证下,还是用上节学的子进程写数据,父进程读取数据的例子,只 ...
- linux系统编程之信号(三)
今天继续对信号进行研究,话不多说,言归正传: 更多信号发送函数: 上节中我们已经接触到了一些信号的发送函数,这里更进一步学习一下其它的发送函数: alarm:只能发送SIGALRM信号 下面通过一个例 ...
- linux系统编程之进程(三)
今天继续学习进程相关的东东,继上节最后简单介绍了用exec函数替换进程映像的用法,今天将来深入学习exec及它关联的函数,话不多说,正式进入正题: exec替换进程映象: 对于fork()函数,它 ...
- Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道
Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道 背景 上一讲我们介绍了创建子进程的方式.我们都知道,创建子进程是为了与父进程协作(或者是为了执行新的程序,参考 Linux ...
- Linux系统编程@进程通信(一)
进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...
随机推荐
- [LeetCode] 655. Print Binary Tree 打印二叉树
Print a binary tree in an m*n 2D string array following these rules: The row number m should be equa ...
- [LeetCode] 681. Next Closest Time 下一个最近时间点
Given a time represented in the format "HH:MM", form the next closest time by reusing the ...
- oracle 添加字段
alter table 表名 add 新增字段名(类型+长度); #添加字段 alter table asset_orders add remark varchar2(255); #查看 descri ...
- redis主从分节
概述 在现有企业中80%公司大部分使用的是redis单机服务,在实际的场景当中单一节点的redis容易面临风险. 面临问题 机器故障.我们部署到一台 Redis 服务器,当发生机器故障时,需要迁移到另 ...
- php利用crontab执行 5分钟发邮件给用户 (包含每分钟发一次)
php利用crontab执行 5分钟发邮件给用户 一开始设想用shell_exec执行sh 运行 crontab但发现并不可取 因为没办法传变量 (因为要传963529987@qq.com)所以决定采 ...
- SpringMVC的拦截器讲解
Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 用户可以自己定义一些拦截器来实现特定的功能. 谈到拦截器,还要向大家提一个词 ...
- python文件夹操作
1.遍历文件夹下所有文件2.将后缀为.DCM的文件复制到指定文件夹 import os import shutil def all_path(dirname): result = []#所有的文件 f ...
- Delphi 10 Seattle plus 新特性——System.JSON.Builders
{ 全能中间件 —— 简单.高效.稳定.安全的三层中间件 1.支持 多账套多数据库,包括SQLite, MySQL, SQL Server, Oracle, PostgreSQL, DB2, SQL ...
- HTML常用技巧
1. 为网页链接添加快捷键:accesskey 属性 https://zhidao.baidu.com/question/2267343500557447508.html 2. 键盘事件设置快捷键:h ...
- 【Linux】一步一步学Linux——Centos7.5安装图解(08)
00. 目录 参考博客:https://mp.csdn.net/mdeditor/95031775# 01. Centos7.5简介 CentOS(Community Enterprise Opera ...