命名管道FIFO
首先我得检讨一下自己,这几天有些颓呀,打不起精神,板子出了点问题,果真自学还是很困难呀,硬件方面难解决呀,理想与现实还是很有差距的,伤透了,凌乱了。
一直在理解进程间通信的问题。发现上次忽略了一个问题,就是命名管道,命名管道和一般的管道有一些显著的不同:
1.FIFO是在文件系统中作为一个特殊的设备文件而存在的;
2.不同祖先的进程之间可以通过管道共享数据;
3.当共享管道的进程执行完所有的I/O操作后,FIFO将继续保存在文件系统中以便以后使用。
这里需要注意一下:管道只能由相关的进程使用,它们共同的祖先进程创建了管道,但是通过FIFO,不相关的进程也能交换数据。
FIFO的创建:
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char * pathname,mode_t mode) ;
返回:若成功则为0,出错为-1;一旦已经mkfifo创建了一个FIFO,就可以open打开它。
当打开一个FIFO时,非阻塞标志会产生如下影响:
(1)一般情况,只读打开要阻塞到某个其它进程为写打开此FIFO。类似,为写打开一个FIFO要阻塞到某个其它进程为读而打开它。
(2)如果指定非阻塞状态,则只读打开立即返回,但是如果没有进程已经为读而打开一个FIFO,那么只写打开将出错返回,其errno是ENXIO。
类似于管道,若写一个尚无进程为读而打开的FIFO,则产生信号SIGPIPE。若某个FIFO的最后一个写进程关闭了该FIFO,则将为该FIFO的读进程产生一个文件结束标志。
具体点代码如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FIFO "/tmp/myfifo" main(int argc,char** argv)
{
char buf_r[];
int fd;
int nread; if((mkfifo(FIFO,O_CREAT|O_EXCL)<)&&(errno!=EEXIST))
printf("cannot create fifoserver\n");
printf("Preparing for reading bytes...\n"); memset(buf_r,,sizeof(buf_r));
fd=open(FIFO,O_RDONLY|O_NONBLOCK,);
if(fd==-)
{
perror("open");
exit();
}
while()
{
memset(buf_r,,sizeof(buf_r)); if((nread=read(fd,buf_r,))==-){
if(errno==EAGAIN)
printf("no data yet\n");
}
printf("read %s from FIFO\n",buf_r);
sleep();
}
pause();
unlink(FIFO);
}
fifo_read
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FIFO_SERVER "/tmp/myfifo" main(int argc,char** argv)
{
int fd;
char w_buf[];
int nwrite; if(fd==-)
if(errno==ENXIO)
printf("open error; no reading process\n");
fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,);
if(argc==)
printf("Please send something\n");
strcpy(w_buf,argv[]);
if((nwrite=write(fd,w_buf,))==-)
{
if(errno==EAGAIN)
printf("The FIFO has not been read yet.Please try later\n");
}
else
printf("write %s to the FIFO\n",w_buf);
}
fifo_write
命名管道FIFO的更多相关文章
- Linux学习笔记25——命名管道(FIFO)
1 命名管道(FIFO) 管道应用的一个重大缺陷就是没有名字,因此只能用于亲缘进程之间的通信.后来从管道为基础提出命名管道(named pipe,FIFO)的概念,该限制得到了克服.FIFO不同于管道 ...
- 进程间通信系列 之 命名管道FIFO及其应用实例
进程间通信系列 之 概述与对比 http://blog.csdn.net/younger_china/article/details/15808685 进程间通信系列 之 共享内存及其实例 ...
- Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...
- 进程间通信___命名管道(FIFO)
命名管道(FIFO) 基本概念 命名管道和一般的管道基本相同,但也有一些显著的不同: 命名管道是在文件系统中作为一个特殊的设备文件而存在的. 不同祖先的进程之间可以通过管道共享数据. 当共享管道的进程 ...
- 命名管道FIFO和mkfifo函数
进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的匿名管道是用打开的文件描述符来标识的.如果要互相通信的几个进程没有从公共祖先那里继承文件描述符,它们怎么通 ...
- 进程间通信:命名管道FIFO(2)
一.命名管道 如果我们想在不相关的进程之间交换数据,可以用FIFO文件来完成这项工作,它通常也被称为命名管道.命名管道是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和我们已经见 ...
- 命名管道FIFO及其读写规则
一.匿名管道的一个限制就是只能在具有共同祖先的进程间通信命名管道(FIFO):如果我们想在不相关的进程之间切换数据,可以使用FIFO文件来做这项工作注意:命名管道是一种特殊类型文件.利用命令:$ mk ...
- mkfifo - 创建FIFO(命名管道)
SYNOPSIS(总览) mkfifo [options] file... POSIX options(选项): [-m mode] GNU options(选项)(最短格式): [-m mode] ...
- linux命名管道通信过程
前一个道,这节学习命名管道. 二命名管道 无名管道仅仅能用来在父子进程或兄弟进程之间进行通信,这就给没有亲缘关系的进程之间数据的交换带来了麻烦.解决问题就是本节要学习的还有一种管道通信:命名管道. 命 ...
随机推荐
- Linux后台运行程序
Linux后台运行程序 最近写的程序需要部署到Linux服务器上,按照以前的方式,在运行后面增加&,程序会切换为后台运行.但因为Linux一般是通过ssh远程登录的,等到退出当前session ...
- [iOS微博项目 - 1.1] - 设置导航栏主题(统一样式)
A.导航栏两侧文字按钮 1.需求: 所有导航栏两侧的文字式按钮统一样式 普通样式:橙色 高亮样式:红色 不可用样式:亮灰 阴影:不使用 字体大小:15 github: https://github ...
- 如何解决paramiko执行与否的问题
使用paramiko执行一些耗时比较长的命令的时候会出现实际上命令没有执行完就跳出的问题,怎么才能准确的判断命令执行完与否很重要,通过试验发现如下的方法可以解决这个难题: dabao_cmd = 'e ...
- log4j中的MDC和NDC
NDC和MDC NDC(Nested Diagnostic Context)和MDC(Mapped Diagnostic Context)是log4j种非常有用的两个类,它们用于存储应用程序的上下文信 ...
- 笔记:搭建Windows2003 VPN跳板
背景:有一台“墙外”主机,利用自建VPN 番羽 土啬.当然,如端口转发.加密代理等很多方法都可以实现上述目的,VPN只是其中一种. 环境:Win2003主机,一个网络接口,一个独立IP,端口不受限 ...
- BZOJ 2243: [SDOI2011]染色 (树链剖分+线段树合并)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2243 树链剖分的点剖分+线段树.漏了一个小地方,调了一下午...... 还是要细心啊! 结 ...
- IoC/DI
From:http://jinnianshilongnian.iteye.com/blog/1471944 我对IoC/DI的理解 博客分类: spring杂谈 IoCDI IoC IoC: Inv ...
- linx目录结构
linux中的命令一般存放在/bin目录下的: 以下为linux下的基本目录结构和作用: /根目录./boot引导程序,内核等存放的目录./sbin超级用户可以使用的命令的存放目录./bin普通用户可 ...
- BZOJ 2456: mode 水题
2456: mode Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...
- delphi 修改Hint的字体和颜色
//修改Hint的字体和颜色 public { Public declarations } procedure Sshowhint(var hintstr:string;var can ...