linux进程间命名管道,Linux进程间通信
8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
上一篇笔记记录了无名管道,也就是匿名管道进行进程间通信必须满足的条件是父子进程,而本篇笔记将记录是是比无名管道通信更加便利的通信方式,也就是命名管道,命名管进程间通信没有父子进程的限制。
二.创建与删除管道文件
FIFO文件,和普通文件操作方式类似,有2种创建和删除FIFO文件的方式
2.1.调用函数
2.1.1.原型创建管道文件函数原型#include
#include
int mkfifo(const char *pathname, mode_t mode);//创建参数pathname为要创建的FIFO文件的全路径名;
参数mode为文件访问权限
如果创建成功,则返回0,否则-1。删除管道文件函数原型#include
int unlink(const char *pathname);参数pathname为要创建的FIFO文件的全路径名;
2.1.2.例子创建///
/// @file 03_1_mkfifo.cpp
/// @author AverageJoeWang([email protected])
///
#include
#include
#include
#include
#include
using std::cout;
using std::endl;
int main()
{
int ret;
ret = mkfifo("./pipe", 0666);
if(-1 == ret)
{
perror("mkfifo create failed!n");
return -1;
}else
printf("success!n");
return 0;
}删除///
/// @file 04_Orphaned.cpp
/// @author AverageJoeWang([email protected])
///
#include
#include
#include
using std::cout;
using std::endl;
int main()
{
unlink("pipe");
return 0;
}
2.2.使用命令mkfifo pipename#创建
rm pipename#删除
2.3.测试
创建完毕之后,就可以访问FIFO文件了:#一个终端:
cat < pipe
#另一个终端:
echo “hello” > pipe
三.访问命名管道
对FIFO类型的文件的打开/关闭跟普通文件一样,都是使用open和close函数。如果打开时使用O_WRONLY选项,则打开FIFO的写入端,如果使用O_RDONLY选项,则打开FIFO的读取端,写入端和读取端都可以被几个进程同时打开。有四种打开管道的方式open(const char *path, O_RDONLY);//1
open(const char *path, O_RDONLY | O_NONBLOCK);//2
open(const char *path, O_WRONLY);//3
open(const char *path, O_WRONLY | O_NONBLOCK);//4
在open函数的调用的第二个参数中,选项O_NONBLOCK表示非阻塞,加上这个选项后,表示open调用是非阻塞的,如果没有这个选项,则表示open调用是阻塞的。
阻塞是对于以只读方式(O_RDONLY)打开的FIFO文件,如果open调用是阻塞的(即第二个参数为O_RDONLY),除非有一个进程以写方式打开同一个FIFO,否则它不会返回;如果open调用是非阻塞的的(即第二个参数为O_RDONLY | O_NONBLOCK),则即使没有其他进程以写方式打开同一个FIFO文件,open调用将成功并立即返回。
对于以只写方式(O_WRONLY)打开的FIFO文件,如果open调用是阻塞的(即第二个参数为O_WRONLY),open调用将被阻塞,直到有一个进程以只读方式打开同一个FIFO文件为止;如果open调用是非阻塞的(即第二个参数为O_WRONLY | O_NONBLOCK),open总会立即返回,但如果没有其他进程以只读方式打开同一个FIFO文件,open调用将返回-1,并且FIFO也不会被打开。
四.使用FIFO实现进程间的通信
接下来使用一个例子来说明使用fifo进行进程间通信首先执行mkfifo pipewrite.cpp文件///
/// @file 03_2_write_pipe.cpp
/// @author AverageJoeWang([email protected])
///
#include
#include
#include
#include
#include
#include
#include
#include
using std::cout;
using std::endl;
int main()
{
int fdFifo = open("pipe", O_WRONLY);//打开一个管道文件,返回一个文件操作符
if(-1 == fdFifo)
{
perror("open failed");
return -1;
}
int ret = write(fdFifo, "hello", 6);//向管道写入内容
if(-1 == ret)
{
perror("write pipe failed!");
return -1;
}
close(fdFifo);//关闭管道
return 0;
}read.cpp文件///
/// @file 03_2_read_pipe.cpp
/// @author AverageJoeWang([email protected])
///
#include
#include
#include
#include
#include
#include
#include
using std::cout;
using std::endl;
int main()
{
int fdFifo = open("pipe", O_RDONLY);//打开管道文件,返回一个文件描述符
if(fdFifo == -1)
{
perror("open failed !");
return -1;
}
char buf[32] = {'
linux进程间命名管道,Linux进程间通信相关推荐
- linux 进程间读写锁,Linux系统编程—进程间同步
我们知道,线程间同步有多种方式,比如:信号量.互斥量.读写锁,等等.那进程间如何实现同步呢?本文介绍两种方式:互斥量和文件锁. ##互斥量mutex 我们已经知道了互斥量可以用于在线程间同步,但实际上 ...
- Linux进程通信——匿名管道、命名管道、管道的特性和共享内存
Linux进程通信--匿名管道.命名管道.管道的特性和共享内存 一.管道 1.1 什么是管道? 1.2 匿名管道 <1> 匿名管道参数说明 <2> fork共享管道原理 < ...
- linux无名管道实验代码,Linux 进程间通讯之创建无名管道和读写无名管道
Linux进程间通讯的方式: 1. 管道(pipe)和有名管道(FIFO). 2. 信号(signal) 3. 消息队列 4. 共享内存 5. 信号量 6. 套接字(socket) 管道通讯: 无名管 ...
- Linux多线程间通信和多进程间通信的方式
文章目录 一.进程间的通信方式 1. 进程间通信的概念 1.1. 进程通信的目的: 1.2. Linux 进程间通信(IPC)的发展 2. 进程间通信的7种方式 2.1. 管道/匿名管道(pipe) ...
- linux共享内存示例,linux 进程间共享内存示例
写入端: #include #include #include #include #include using namespace std; struct MappingDataType { int ...
- Linux进程间同步和通信,linux进程间的同步方法
进程间通讯(IPC)方法主要有以下几种: 管道/FIFO/共享内存/消息队列/信号 1.管道中还有命名管道和非命名管道(即匿名管道)之分,非命名管道(即匿名管道)只能用于父子进程通讯,命名管道可用于非 ...
- 深刻理解 Linux 进程间七大通信(IPC)
前言 网络编程是 Linux C/C++的面试重点,今天我就来聊一聊进程间通信的问题,文章末尾列出了参考资料,希望帮助到大家. 篇幅有点长,希望大家耐心阅读. Linux 下的进程通信手段基本上是从 ...
- Linux进程间通过pipe通信
转自:http://blog.chinaunix.net/uid-26225097-id-2846652.html wang_qiao_ying Linux环境进程间通信_pipe(一) 2 ...
- msgget();msgsnd();msgrcv();msgctl(); 消息队列 Linux进程间的通信方式之消息队列
Linux进程间的通信方式 ----消息队列. 消息队列和共享内存类似 消息队列它允许一个或多个进程向它写消息,一个或多个进程向它写读消息. 消息队列存在于系统内核中,消息的数量受系统限制. 我们来看 ...
- Linux 进程间通讯(IPC)方式 ------- 共享内存
Linux 进程间通讯(IPC)方式有以下几种: 1->管道(pipe)和有名管道(fifo). 2->消息队列 3->共享内存 4->信号量 5->信号(signal) ...
最新文章
- Python忽略warning警告错误
- es_分组-分页-TransportClient实现
- 博士申请 | 加拿大麦吉尔大学丁俊老师招收机器学习全奖博士/硕士/实习生
- 在Qt Designer中使用自定义Widgets小部件
- Unity超级角色控制器研究(四)——地形检测
- RabbitMQ系列-顺序消费模式和迅速消息发送模式
- 爬虫中如何获取页面编码类型
- Android中列表动态删除item,如何删除Android ExpandableListView中某个group item的child item?...
- OpenCV2.2的编译及其使用
- 【激活函数】Mish激活函数详解
- Linux下磁盘分区卸载和磁盘配额
- 验证手机号码的JS方法
- 将 PDF 转换为矢量图 emf
- 使用 WinRAR 将bat转exe
- 时钟芯片AD9520
- 用scrapy框架爬取拉勾网招聘信息
- python深度学习tensorflow和fme结合,实现档案扫描件数据自动分类
- JavaEE学习记录Day08、09、10
- 论坛没落了吗?传统BBS(论坛)何去何从?
- 易语言 Visual Basic 6.0 (VB6)