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系统 ...
随机推荐
- 【Python开发】【编程开发】各种系统的清屏操作命令
mac os x terminal清屏快捷键 cammand+k linux系统清屏快捷键 ctrl+l linux系统命令行清屏命令 clear windows 命令行清屏命令 cls Matlab ...
- 利用function和bind实现回调功能
介绍一种利用function和bind来实现回调的功能. C++参考手册中对function的介绍: std::function的实例能存储.复制及调用任何可调用的目标,包括:函数.lambda表达式 ...
- npm包的语义版本控制(Semantic Versioning of Packages)
本文删改自Node.js 8 the Right Way Part I Chapter 3 npm 使用语义版本控制(SemVer)来寻找包的最佳可用兼容版本. 以安装测试框架mocha为例 $ ...
- js 获取服务端时间,并实现时钟
本例子以vue语法伪代码书写: 1,获取服务端北京时间 getRealTime() { let that = this; var xhr = new XMLHttpRequest(); if( !xh ...
- while 语句的逻辑
# i =3# username = '大天天'# password = 123# while i > 0:# name = input('请输入你的名字:')# i -= 1# if name ...
- Mac上go的下载安装教程
mac上go的下载安装教程 官网https://golang.google.cn/dl/下载,安装 环境变量配置 参考https://www.jianshu.com/p/5c1873eaf3ca Ba ...
- Golang 实现单例模式
目录 只适用于单线程环境 支持并发版本 优化并发版本 sync.Once版本 只适用于单线程环境 package main import "fmt" type Single str ...
- [LOJ2290] [THUWC2017] 随机二分图
题目链接 LOJ:https://loj.ac/problem/2290 洛谷:https://www.luogu.org/problemnew/show/P4547 Solution 首先考虑只有第 ...
- Docker学习笔记(一)—— 概述
1. Docker是个什么玩意 说Docker是什么之前,先来看一看Docker为什么会出现.我们知道,在学习过程中我们需要频繁地安装配置一些软件,不管是在Windows下还是在Linux,这些东西的 ...
- 通过设置启用 Visual Studio 默认关闭的大量强大的功能提升开发效率
原文:通过设置启用 Visual Studio 默认关闭的大量强大的功能提升开发效率 使用 Visual Studio 开发 C#/.NET 应用程序,以前有 ReSharper 来不足其各项功能短板 ...