上一篇博客已经介绍了一种进程间通信的方式,但是那只是针对于有血缘关系的进程,即父子进程间的通信,那对于没有血缘关系的进程,那要怎么通信呢? 
  这就要创建一个有名管道,来解决无血缘关系的进程通信, fifo:

book@ubuntu:~$ mkfifo xwp
book@ubuntu:~$ ls -l myfifo
prw-rw-r-- book book Feb myfifo

mkfifo 既有命令也有函数

#include <sys/types.h>
#include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode);
 /* fifo_write.c */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h> void sys_err(char *str, int exitno)
{
perror(str);
exit(exitno);
} int main(int argc,char *argv[])
{
int fd, len;
char buf[] = "hello world\n";
if(argc < )
{
printf("./app myfifo\n");
exit();
} fd = open(argv[],O_WRONLY);
if(fd < )
sys_err("open",); write(fd, buf, strlen(buf));
close(fd); return ;
} /* fifo_read */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h> void sys_err(char *str, int exitno)
{
perror(str);
exit(exitno);
} int main(int argc,char *argv[])
{
int fd, len;
char buf[] = {};
if(argc < )
{
printf("./app myfifo\n");
exit();
} fd = open(argv[],O_RDONLY);
if(fd < )
sys_err("open",); read(fd, buf, sizeof(buf));
write(STDOUT_FILENO, buf, strlen(buf));
close(fd); return ;
} 操作方法:
分别编译成可执行程序:fifo_write 和 fifo_read
在一个终端下输入 ./fifo_write myfifo
在另一个终端下输入 ./fifo_read myfifo
即可观察到结果

注:

  • 当只写打开FIFO管道时,该FIFO没有读端打开,则open写打开会阻塞
  • FIFO内核实现时可以支持双向通信。(pipe单向通信,因为父子进程共享同一个file结构体)
  • FIFO可以一个读端,多个写端;也可以一个写端,多个读端。

其实fifo指向的还是内核中的缓冲区,只不过他指向所有的内核缓冲区,因此他不是阻塞的,不像pipe只是指向两端,造成阻塞现象

 
 

linux 进程间通信 之fifo的更多相关文章

  1. Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)

    整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...

  2. Linux 进程间通信之管道(pipe),(fifo)

     无名管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信: 定义函数: int pipe(int f ...

  3. Linux进程间通信(四):命名管道 mkfifo()、open()、read()、close()

    在前一篇文章—— Linux进程间通信 -- 使用匿名管道 中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关 ...

  4. Linux进程间通信

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们在Linux信号基础中已经说明,信号可以看作一种粗糙的进程间通信(IPC, i ...

  5. Linux 进程间通信(二) 管道

    Linux 进程间通信-管道 进程是一个独立的资源分配单位,不同进程之间的资源是相互独立的,没有关联,不能在一个进程中直接访问另一个进程中的资源.但是,进程不是孤立的,不同的进程之间需要信息的交换以及 ...

  6. linux进程间通信-概述

    一 进程间通信有如下的目的: 1.数据传输,一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M之间:2.共享数据,多个进程想要操作共享数据,一个进程对数据的修改,其他进程应该立刻看到 ...

  7. 【转】 Linux进程间通信

    一.进程间通信概述进程通信有如下一些目的:A.数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间B.共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别 ...

  8. (转)Linux进程间通信

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 谢谢nonoob纠错 我们在Linux信号基础中已经说明,信号可以看作一种粗糙的进 ...

  9. Linux进程间通信(IPC)

    序言 linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的. 而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心) ...

随机推荐

  1. PHP的几种排序算法的比较

    这里列出了几种PHP的排序算法的时间比较的结果,,希望对大家有所帮助 /* * php 四种排序算法的时间与内置的sort排序比较 * 3000个元素,四种算法的排序所用的时间比较 * 冒泡排序 85 ...

  2. HUST 1606 Naive

    预处理一下,然后o(1)询问. #include<cstdio> #include<cstring> #include<cmath> #include<str ...

  3. iOS开发——UIImageView

    1.图像点击之后,全屏浏览 - (void)viewDidLoad { [super viewDidLoad]; _myImage=[[UIImageView alloc]initWithFrame: ...

  4. CSS判断不同分辨率显示不同宽度布局CSS3技术支持IE6到IE8

    CSS判断不同分辨率浏览器(显示屏幕)显示不同宽度布局CSS3技术支持IE6到IE8.将用到css3 @media样式进行判断,但IE9以下版本不支持CSS3技术,这里DIVCSS5给大家介绍通过JS ...

  5. 【转】10个重要的Linux ps命令实战

    Linux作为Unix的衍生操作系统,Linux内建有查看当前进程的工具ps.这个工具能在命令行中使用. PS 命令是什么 查看它的man手册可以看到,ps命令能够给出当前系统中进程的快照.它能捕获系 ...

  6. ajax 注册

    $(document).ready(function(e){ $("#uid").blur(function(){ var uid = $("#uid").va ...

  7. Practice Round China New Grad Test 2014 报告

    今天有Google of Greater China Test for New Grads of 2014的练习赛,主要是为了过几天的校园招聘测试做练习用的,帮助熟悉平台,题目嘛,个人觉得除了A题外, ...

  8. ArcGIS Server的切图原理深入(转载)

    http://forum.osgearth.org/template/NamlServlet.jtp?macro=search_page&node=2174485&query=arcg ...

  9. localStorage eval script

    var globalEval =function(data) { (window.execScript || function(data){ window.eval.call(window,data) ...

  10. session锁问题

    碰到个问题,在使用了session时(如用户登录),如果当前请求时间过长,再执行其他请求都不会有响应,查找了网上资料发现,这个是session锁的问题 目前我们的程序基本流程如下: (1)加载Sess ...