使用 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()
{
    int pipe_fd;
    int res;
    int open_mode = O_WRONLY;
    int bytes_sent = 0;
    char buffer[BUFFER_SIZE + 1];

    if( -1 == access(FIFO_NAME, F_OK) ) {
        res = mkfifo( FIFO_NAME, 0777 );  //创建一个FIFO
        if( 0 != res ) {
            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( -1 != pipe_fd ) {
        while( bytes_sent < TEN_MEG ) {
            res = write( pipe_fd, buffer, BUFFER_SIZE );
            if( -1 == res ) {
                fprintf( stderr, "Write error on pipe\n");
                exit( EXIT_FAILURE );
            }
            bytes_sent += res;
        }
        close( pipe_fd );
    }
    else
        exit( EXIT_FAILURE );

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

消费者程序

第二个程序是消费者程序,它从 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

int main()
{
    int pipe_fd;
    int res;
    int open_mode = O_RDONLY;
    int bytes_read = 0;
    char buffer[BUFFER_SIZE + 1];

    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( -1 != pipe_fd ) {
        do {
            res = read( pipe_fd, buffer, BUFFER_SIZE );
            if( -1 == res ) {
                fprintf( stderr, "Write error on pipe\n");
                exit( EXIT_FAILURE );
            }
            bytes_read += res;
        }while( res>0 );
        close( pipe_fd );
    }
    else
        exit( EXIT_FAILURE );

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

程序运行结果

时间: 2024-10-12 14:43:13

使用 FIFO 实现进程间通信示例的相关文章

Linux进程间通信-命名管道

前面我们讲了进程间通信的一种方式,匿名管道.我们知道,匿名管道只能用于父子关系的进程之间.那么没有这种关系的进程之间该如何进行数据传递呢? 1.什么是命名管道 匿名管道是在缓存中开辟的输出和输入文件流的空间,只能用于父子关系的进程之间.因为父子进程的输入和输出文件描述符是一致的.命名管道是一种实际存在的FIFO文件,称作“管道文件”,用于不同进程之间,命名管道进程间打开同一个FIFO文件,进行数据传递.我们可以像普通文件一样操作FIFO文件.不同进程,引用同一个FIFO文件,进行数据传递. 2.

进程间通信之命名管道

命名管道(FIFO)是进程间通信的一种方式,DEMO如下: // 写进程 int main(int argc, char **argv) { char filename[] = "/tmp/my_fifo"; if (mkfifo(filename, 0777) < 0) { perror("mkfifo error"); exit(1); } int fd = open(filename, O_WRONLY); char buffer[128] = &quo

linux程序设计——对FIFO进行读写操作(第十三章)

4.对FIFO进行读写操作 使用O_NONBLOCK模式会影响的对FIFO的read和write调用. 对一个空的,阻塞的FIFO(即没有用O_NONBLOCK标志打开)的read调用将等待,直到有数据可以读时才继续执行.与此相反,对一个空的,非阻塞的FIFO的read调用将立刻返回0字节. 对一个完全阻塞的FIFO的write调用将等待,直到数据可以写入时才继续执行.如果非阻塞的FIFO不能接收所有写入的数据,它将按下面的规则执行. 如果请求写入的数据长度小于等于PIPE_BUF字节,调用失败

进程间通信第一课--管道

一个进程连接数据流到另一个进程--管道--pipe 进程管道 1 #include <stdio.h> 2 FILE * popen(const char * command, const char * open_mode) 3 int pclose(FILE * stream_to_close); popen函数允许一个程序将另一个程序作为新进程来启动并可以传递数据给它或者通过它接收数据command是要运行的程序名和相应的参数open_mode必须是r或者是wr的情况是:被调用程序的输出可

20155212 2017-2018-1 《信息安全系统设计》第10周学习总结

20155212 2017-2018-1 <信息安全系统设计>第10周学习总结 stat命令的实现-mysate 要求:学习使用stat(1),并用C语言实现 学习stat(1) 功能:显示文件或者文件系统信息 语法:stat [选项] 文件 选项参数: null:显示详细信息 -l:链接 -f:不显示文件的信息,而显示其所在文件系统的信息 -t:显示简洁的信息 -c:以指定格式输出 man 1 stat查看stat命令 使用stat命令 使用man -k stat | grep 2函数找到如

QT多线程[转]

Qt作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功能.为了满足用户构造复杂图形界面系统的需求,Qt提供了丰富的多线程编程支持.从 2.2 版本开始,Qt主要从下面三个方面对多线程编程提供支持:一.构造了一些基本的与平台无关的线程类:二.提交用户自定义事件的 Thread-safe方式:三.多种线程间同步机制,如信号量,全局锁.这些都给用户提供了极大的方便.不过,在某些情况下,使用定时器机制能够比利用 Qt本身的多线程机制更方便地实现所需要的功能,同时也避免了

Linux间的进程通信;以及子进程的创建

1 "-----第六天-----------------------------------------------------------------------------" 2 3 1.版本控制:svn/git; 4 5 2.进程的概念: 6 1)程序和进程: 7 每个进程操作系统会为它分配 0-4G 的虚拟内存空间(32位操作系统): 其中0-3G为用户内存空间,进程可以对它进行读写操作: 3G - 4G 为系统内核空间,进程没有读写权限. 8 进程只能读写用户空间,没有权限读

20135231 —— 第十一周任务总结报告

预计学习时间:7h 实际花费时间:9h 学习目标 ·掌握进程控制 ·掌握信号处理的方法 ·掌握管道和fifo进行进程间通信的方法 学习任务 编译.运行.阅读.理解process.tar.gz压缩包中的代码 process代码 exec1 #include <stdio.h>#include <unistd.h> int main(){ char *arglist[3]; arglist[0] = "ls"; arglist[1] = "-l"

20135223何伟钦—信息安全系统设计基础第十二周学习总结

一.学习目标 1.掌握进程控制 2.掌握信号处理的方法 3.掌握管道和fifo进行进程间通信的方法 二.学习资源 编译.运行.阅读.理解process.tar.gz压缩包中的代码 三.编译.运行.阅读.理解代码 (1)exec1 execvp函数 表头文件: #include 定义函数: int execvp(const char file ,char const argv []); execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二