进程通信(接上篇PFIFO)

原创 2013年12月05日 17:41:49
对于pipe只能用于一个进程家族之间通信,如果想要让管道在更宽泛的环境中,那是不行的,原因是它没有名字的,另外的进程看不到它,这样就有了命名管道。
命名管道叫FIFO,可以用mkfifo()在磁盘上创建一个FIFO文件
这就是它与pipe的本质区别,pipe完全就是存在与内存中
当进程想通过该FIFO来通信时就可以标准的open打开该文件,然后开始读写操作。
对于FIFO的读写实现,它与pipe的区别在于:FIFOopen这一操作,而pipe是在调用pipe这个系统调用时直接创建了一对文件描述符用于通信。
并且,FIFOopen操作还有些细致的地方要考虑,例如如果写者先打开,尚无读者,那么肯定是不能通信了,所以就需要先去睡眠等待读者打开该FIFO,反之对读者亦然。
所需头文件

     #include <sys/types.h>

     #include <sys/stat.h>

 

命名管道FIFO举例:

写端:

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <fcntl.h>

#include <limits.h>

#include <sys/types.h>

#include <sys/stat.h>

#define FIFO_NAME "/tmp/my_fifo"

#define BUFFER_SIZE PIPE_BUF

#define TEN_MEG (1024 * 1024 * 10)

  int main()

{

    intpipe_fd;

    int res;

    intopen_mode = O_WRONLY;

    intbytes_sent = 0;

    char buffer[BUFFER_SIZE + 1];

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

        res = mkfifo(FIFO_NAME, 0777);

        if (res != 0) {

            fprintf(stderr, "Could not create fifo %s\n", FIFO_NAME);

            exit(EXIT_FAILURE);

        }

    }

printf("Process %d opening FIFO O_WRONLY\n", getpid());

    pipe_fd = open(FIFO_NAME, open_mode);

    printf("Process %d result %d\n", getpid(), pipe_fd);

    if (pipe_fd != -1) {

        while(bytes_sent < TEN_MEG) {

            res = write(pipe_fd, buffer, BUFFER_SIZE);

            if (res == -1) {

                fprintf(stderr, "Write error on pipe\n");

                exit(EXIT_FAILURE);

            }

            bytes_sent += res;

        }

        (void)close(pipe_fd);

    }

    else {

        exit(EXIT_FAILURE);       

    }

    printf("Process %d finished\n", getpid());

    exit(EXIT_SUCCESS);

}

读端:

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <fcntl.h>

#include <limits.h>

#include <sys/types.h>

#include <sys/stat.h>

#define FIFO_NAME "/tmp/my_fifo"

#define BUFFER_SIZE PIPE_BUF

int main()

{

    intpipe_fd;

    int res;

    intopen_mode = O_RDONLY;

    char buffer[BUFFER_SIZE + 1];

    intbytes_read = 0;

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

   

    printf("Process %d opening FIFO 

                        O_RDONLY\n", getpid());

    pipe_fd = open(FIFO_NAME, open_mode);

    printf("Process %d result %d\n", getpid(),

               pipe_fd);

if (pipe_fd != -1) {

        do {

            res = read(pipe_fd, buffer, BUFFER_SIZE);

            bytes_read += res;

        } while (res > 0);

        (void)close(pipe_fd);

    }

    else {

        exit(EXIT_FAILURE);

    }

    printf("Process %d finished, %d bytes read\n", getpid(), bytes_read);

    exit(EXIT_SUCCESS);

}

 

接上篇

我本来想让Bcb版块的朋友都看到的,但没有该版块,就选了c/c++版块.结果发不上去.汗.......改成最后的选项就Ok了,不发表到Csdn技术中心.没劲!...
  • chpst
  • chpst
  • 2006年05月17日 17:33
  • 433

接上篇...........

               古老的人说他是时间的主人,现在的人却说他是时间的奴隶。我想这就是区别:                                                  ...
  • wangjihong83
  • wangjihong83
  • 2007年08月27日 19:06
  • 404

接上篇的setmax.c

/* setmax.c - aeb, 000326 - use on 2.4.0test9 or newer *//* IBM part thanks to Matan Ziv-Av *//* * ...
  • ylhcom
  • ylhcom
  • 2008年07月29日 11:25
  • 352

Java 垃圾回收(接上篇)

        上篇说到Java垃圾回收(GC),由于某种原因,没有写完,本篇接着上篇继续。        上篇有一个例子(GCTest),程序运行的结果如果:Program start...Free...
  • wdhSoft
  • wdhSoft
  • 2007年05月24日 10:01
  • 1104

二叉查找树常用操作(接上篇)

二叉查找树是一种重要的数据结构二叉查找树常见的操作时间复杂度一般为O(h)O(h),hh为树的深度。此处补充二叉查找树中结点的搜索、删除,以及对应前驱、后继。此外前驱后继结点中还涉及到求子树的最大\最...
  • jack_thu
  • jack_thu
  • 2015年03月14日 23:11
  • 250

接上篇,摘录后记:

                     后记  1992年秋天,我从中国科学院数学研究所毕业回到武汉,在中国地质大学计算机科学与技术系讲授编译原理与人工智能课程 。大约是11月上旬的一天,同系的孟永...
  • anyue417
  • anyue417
  • 2005年03月06日 16:26
  • 1043

关于设计--接上篇

接着上篇的思路往下想。这里,应该纠正上次关于“设计”的说法。上篇随笔里提到的设计,确切地说,只是一种使用方案的设计,算不上高层次的设计。就好比给了你七块板子,你可以用着它们拼出想要的图形。但是别忘了,...
  • bethz
  • bethz
  • 2005年09月29日 10:57
  • 493

接上篇博客:TabHost

正文 TabHost的实现分为两种,一个是不继承TabActivity,一个是继承自TabActivity;当然了选用继承自TabActivity的话就相对容易一些,下面来看看分别是怎样来实现的吧。...
  • songchen1314af
  • songchen1314af
  • 2016年06月06日 17:49
  • 458

接上篇--数据处理脚本

并口-把并口监视信号转成无重复.jsfso = new ActiveXObject("Scripting.FileSystemObject");var a = fso.openTextFile("aa...
  • pjdsydzxw
  • pjdsydzxw
  • 2010年12月04日 23:05
  • 211

pfifo_fast

pfifo_fast是Linux内核默认的无类队列规范,例如: [root@Kendo ~]# tc qdisc show dev eth0 qdisc pfifo_fast 0: bands...
  • oria2006
  • oria2006
  • 2013年11月21日 15:05
  • 750
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:进程通信(接上篇PFIFO)
举报原因:
原因补充:

(最多只允许输入30个字)