linux pipe 命名管道,linux 进程学习笔记-named pipe (FIFO)命名管道

与“无名管道”不同的是,FIFO拥有一个名称来标志它,所谓的名称实际上就是一个路径,比如“/tmp/my_fifo”,其对应到磁盘上的一个管道文件,如果我们用file命令来查看其文件类型的话,会得到如下输出:

my_fifo: fifo (named pipe)

为了简化对FIFO的理解,我们可以这样来假想:进程A在磁盘上创建了一个名为my_fifo的文件,并向其中写入一些数据,然后进程B打开该文件,并将数据从文件中读出,这样我们便实现了进程A和进程B之间的通信。大致原理如此,只不过FIFO做了更精细的一些操作,以便实现起来更可靠.

int mkfifo (char* path, mode_t mode)

该函数负责创建FIFO管道,其需要头文件,参数path即要创建的管道文件存放位置,mode参数即文件权限。FIFO管道创建完成以后,便可以使用open函数来打开它,然后进行读写操作了。

下面这个demo,其将测试数据由进程A传递给进程B(为防止混淆视线,我将一些条件判断和异常处理代码删掉了)

先创建一个程序A,其负责创建FIFO管道,并向其中写入一些数据:

/*

* process A: create FIFO and write data

*/

#include

#include

#include

#include

#include

#include

#include

#include

#define FIFO_NAME "/tmp/my_fifo"

int main()

{

int pipe_fd;

//if the pipe file do not exist

if (access(FIFO_NAME, F_OK) == -)

{

//creat FIFO pipe file

mkfifo(FIFO_NAME, );

}

//open FIFO pipe file.

//this will be brocked until some one open another end point(read-point) of this pipe

pipe_fd = open(FIFO_NAME, O_WRONLY);

//write data into pipe

write(pipe_fd, "hi, this is a test", PIPE_BUF);

//close FIFO pipe file descriptor

close(pipe_fd);

return ;

}

然后创建程序B,它从管道中读取数据并显示出来:

/*

* process B: read data from FIFO

*/

#include

#include

#include

#include

#include

#include

#include

#include

#define FIFO_NAME "/tmp/my_fifo"

#define BUFFER_SIZE PIPE_BUF

int main()

{

int pipe_fd;

char buffer[BUFFER_SIZE + ];

//reset all bytes in buffer as '\0'

memset(buffer, '\0', sizeof(buffer));

//open FIFO pipe file.

//this will be brocked until some one open another end point(write-point) of this pipe

pipe_fd = open(FIFO_NAME, O_RDONLY);

if(read(pipe_fd, buffer, BUFFER_SIZE) > )

{

printf("data from FIFO : %s\n", buffer);

}

//close pipe file descriptor

close(pipe_fd);

return ;

}

运行下程序便会发现,无论是先运行A或是B,先运行起来的都会等待另外一个,这时open函数第二个参数的原因,我们可以添加O_NONBLOCK选项来取消阻塞。

Linux中的pipe(管道)与named pipe(FIFO 命名管道)

catalogue . pipe匿名管道 . named pipe(FIFO)有名管道 1. pipe匿名管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常 ...

linux进程学习笔记

学习了linux下的进程,觉得应该整理一下,忘得差不多了,顺便回顾一下. 学而时习之,不亦说乎~~ 进程笔记 ,什么是进程? The Single UNIX Specification, Versio ...

linux 进程学习笔记-进程pipe管道

所谓“进程间通信(IPC,inter-process communication)”,按照其目的讲就是让进程之间能够“共享数据”,“传输数据”,“事件通知”等,我所知道的一共有“管道” “信号” “消 ...

Linux 进程学习笔记

1.什么是程序?什么是进程?它们有什么区别? 定义: 程序:程序(Program)是一个静态的命令集合,程序一般放在磁盘中,然后通过用户的执行来触发.触发后程序会加载到内存中成为一个个体,就是进程. ...

linux 进程学习笔记-进程ID,PID

PID,进程号 , 范围在2~(??为什么需要这么多),而一个名为idle (或swapper)的进程占据的编号0,init进程占据了编号1. 进程0和进程1 : 系统启动时会从无到有地创建进程0,它 ...

linux 进程学习笔记-进程调度

在分时系统中,系统将CPU时间划分成无数个时间片(quantum)分配给不同的进程,一个时间片只执行一个进程,并且不停地切换,以让用户感觉到各个进程是在“同时运行”,这中间所需要的策略和算法便是进程调 ...

linux 进程学习笔记-进程跟踪

进程跟踪 long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); Linux用ptrace来进行进 ...

linux 进程学习笔记-进程信号sigal

信号(或软中断)是在软件层次上对中断的一个模拟,其运行在“用户空间”,一个进程对另外一个或几个进程通过发送信号来实现异步通信.当接收进程接收到信号后,其可以注册一下处理函数来说对这些信号进行处理(也可 ...

linux 进程学习笔记-运行新进程

我们知道,当用fork启动一个新进程以后,新进程会复制父进程的大部份内存空间并接着运行父进程中的代码,如果我们使新进程不运行原父进程的代码,转而运行另外一个程序集中的代码,这就相当于启动了一个新程序. ...

随机推荐

初识SSH框架

想了解SSH的工作原理吗?还不快快来看我的新文章----ssh框架的工作原理 也许你还不知道SSH存在的意义,但只是因为在没点开这篇文章之前的事了. SSH由Strut2,Spring,Hiberna ...

java判断字符串是否为数字或中文或字母

个人认为最好的方法 *各种字符的unicode编码的范围:     * 汉字:[0x4e00,0x9fa5](或十进制[19968,40869])     * 数字:[0x30,0x39](或十进制 ...

Sunday算法(字符串查找、匹配)

字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简单的 ...

TCP/IP详解学习笔记(11)-TCP交互数据流,成块数据流

目前建立在TCP协议上的网络协议特别多,有telnet,ssh,有ftp,有http等等.这些协议又可以根据数据吞吐量来大致分成两大类:(1)交互数据类型,例如telnet,ssh,这种类型的协议在大 ...

wpf下拉框不能多选的原因

我用Cocos2d-x模拟《Love Live!学院偶像祭》的Live场景(二)

上一章分析了Live场景中各个元素的作用,这一章开始来分析最关键的部分——打击物件的实现. 上一章放出的视频很模糊,先来看一个清晰版的复习一下:http://www.bilibili.com/vide ...

[java,2019-01-25] 图片和二进制互转

import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOu ...

Windows系统崩溃后快速恢复Oracle数据库的妙招

Windows系统崩溃后快速恢复Oracle数据库,以下是操作步骤 假设oracle数据安装在d:\\oracle文件夹中,数据库名称orcl 1>将崩溃的数据库安装目录"d:\\or ...

CS100.1x-lab4_machine_learning_student

这是这门课第一次接触机器学习,主题是Predicting Movie Ratings.难度比上一次作业要简单点..上一次作业真的挺难...相关ipynb文件见我github. 这里我们会用到Spark ...

Pinger2

import java.io.IOException;import java.io.InputStreamReader;import java.io.LineNumberReader;import j ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值