进程通信(接上篇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);

}

 

相关文章推荐

JMS消息中间件原理及ActiveMQ在企业中的应用(接上篇)

代码实现:发送消息---》接受消息---》服务器配置 //1 发送消息(接受回复消息) public class SenderMessageService { //发布指定消息到指定地址(在发布...

Android Studio下JNI编程2(接上篇,详细讲解java与c层互传参数)

Android Studio下JNI环境搭建、编译、运行等可以参考: http://blog.csdn.net/huangximin1990/article/details/50441400 ...

最小二乘法的新体(接上篇)

在学习线性回归中,接触了到最小二乘法,知道怎么用它来解决回归问题,但其本质还没深入地理解,然后在项目中也听到了这个知识点,所以就有了这篇笔记。       最小二乘法的核心就是使得所有数据的偏差平方和...

接上篇《iOS 的Push Notification的证书处理和客户端接收处理》

接上篇,上文讲了iOS的Push Notification的证书处理,第二部分应该将客户端接收处理了。这块比较复杂,找了好多资料,然后看apple的官方说明,最后总算是明白一些了。 首先需要知道一个应...

简单解析json数据(接上篇创建json数据)

解析json数据(接上篇 创建json数据) 1. 先了解json数据格式 { 键:值,键:值,... } [ 值,值,... ] 2. 创建 JSONObject 与 JSONArray 对象 传入...

(接上篇)详解XML的DTD

DTD的结构一般由元素类型声明、属性表声明、实体声明、记号(notation)声明等构成。一个典型的文档类型定义文件会把将来所要创建的XML文档的元素结构、属性类型、实体引用等预先进行定义。 1、元素...
  • xia7139
  • xia7139
  • 2013年07月22日 17:04
  • 1073

关于iOS的后台下载和断点续传,说一说自己的理解(二,接上篇)

因为上一篇有一些细节还是没有说透,特别是断点续传这里,继续和大家聊一聊这里面的问题。 1. 关于resumedata的bug, 目前苹果在10.2中已经解决了,也就是说做适配的同学只需要额外考虑10...

restangular: Differences with $resource 接上篇Something about http request in angularjs

转自: Differences with $resource Restangular has several features that distinguish it from $reso...

MySQL复制之GTID跳过与FEDERATED存储引擎(接上篇)

在上一篇中,我们使用如下方式跳过了5502这个event。那么为什么可以成功跳过呢?基于什么原理呢? 下面来简单阐述: mysql> stop slave; Query OK, 0 rows a...
  • q3dxdx
  • q3dxdx
  • 2016年03月22日 12:00
  • 89

(接上篇)在控制台、WinForm项目中的嵌入mdf文件(注)

在项目中用程序中嵌入mdf文件的方式来进行SQLServer数据库开发非常方便,用来发布开源项目等很方便,点击就可以运行,免部署,特别是在教学中用起来更加方便,老师不用先将数据库文件detach再发给...
  • liziki
  • liziki
  • 2012年04月05日 18:30
  • 349
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:进程通信(接上篇PFIFO)
举报原因:
原因补充:

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