linux进程通信--有名管道

原创 2016年05月30日 19:31:46

在前面介绍了无名管道的通信方式,无名管道主要用于具有亲缘关系的进程通信(包括父进程与子进程通信以及兄弟进程通信),本文介绍有名管道通信,那么可想而知,有名管道是用于任意两个进程之间的通信。

  • 特点

    • 可以实现任意两个互不相关的进程之间的通信;
    • 有名管道创建后,对其操作类似于文件操作,可以使用read,open,write等操作,并且有名管道可以在文件路径下显示。有名管道的数据严格执行先进先出的规则。
  • 下面是有名管道的应用实例

//有名管道的读取操作
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>
#include <limits.h>
#include <string.h>
/************************************

读取管道内容写到文件中去,进行保存
int mkfifo(const char *pathname, mode_t mode);创建管道函数
mode 指的是权限 

int access(const char *pathname, int mode); 判断文件名是否存在

int open(const char *pathname, int flags); //两个参数的open
int open(const char *pathname, int flags, mode_t mode);//三个参数的open

flag的取值为 O_RDONLY,  O_WRONLY,  or  O_RDWR.  
            read-only, write-only, or read/write, respectively.

**************************************/
int main()
{
     char *file="datareadfrompipes.txt";//存管道读取的内容文件
     char *fifo_name="name_fifo";//管道名称
     int fd_fifo,fd_pipe,fd_data;
     int byte_read,byte_acc;
     char buffer[PIPE_BUF+1];
     printf("Program writeread start run!!\n");
     memset(buffer,'\0',sizeof(buffer));
     fd_pipe=open(fifo_name,O_RDONLY);//打开管道
     fd_data=open(file,O_WRONLY|O_CREAT,0777);  //打开文件
     printf("Current process pid is %d,pipe is %d\n",getpid(),fd_pipe);
    if(fd_pipe!=-1)
    {
        do{
            byte_read=read(fd_pipe,buffer,PIPE_BUF);
            write(fd_data,buffer,byte_read);
            byte_acc+=byte_read;
         }
        while(byte_read>0);
        close(fd_pipe);
        close(fd_data);
    }
    return 0;
}
  • 上述程序主要实现的是从管道中实现从管道中读取数据,并将其存到datareadfrompipes.txt文件中,操作完全类似于文件的读写操作。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>
#include <limits.h>

/************************************

将文件的内容读取,写到管道中去
int mkfifo(const char *pathname, mode_t mode);创建管道函数
mode 指的是权限 

int access(const char *pathname, int mode); 判断文件名是否存在

int open(const char *pathname, int flags); //两个参数的open
int open(const char *pathname, int flags, mode_t mode);//三个参数的open

flag的取值为 O_RDONLY,  O_WRONLY,  or  O_RDWR.  
            read-only, write-only, or read/write, respectively.

**************************************/
int main()
{
     char *file="data.txt";
     char *fifo_name="name_fifo";
     int fd_fifo,fd_pipe,fd_data;
     char buffer[PIPE_BUF+1];
     int byte_acc;
     printf("Program writepipes start run!!\n");
     if(access(fifo_name,F_OK)==-1)//文件不存在 再创建管道
    {
         fd_fifo=mkfifo(fifo_name,0777);
         if(fd_fifo==-1)
         {
            printf("Creat namefifo failed!!\n");
            exit(EXIT_FAILURE);
         }
         else
            printf("Creat namefifo sucess!!\n");
    }
    else
    {
        printf("Creat namefifo failed!!\n");
        exit(EXIT_FAILURE);
    }
    fd_pipe=open(fifo_name,O_WRONLY);//打开管道
    fd_data=open(file,O_RDONLY);    //打开文件

    printf("Current process pid is %d,pipe is %d\n",getpid(),fd_pipe);
    if(fd_pipe!=-1)  //管道读取成功一直循环
    {
        int read_byte=0,write_byte;
        read_byte=read(fd_data,buffer,PIPE_BUF);
        buffer[read_byte]='\0';
        while(read_byte>0)
        {
            write_byte=write(fd_pipe,buffer,read_byte);
            if(write_byte<0)
                {
                    printf("write pipe failed!!\n");
                    exit(EXIT_FAILURE);
                }
            byte_acc+=write_byte;
            read_byte=read(fd_data,buffer,PIPE_BUF);
            buffer[read_byte]='\0';
        }
    close(fd_pipe);
    close(fd_data);

    }

    return 0;
}
  • 此程序实现有名管道的创建于数据的写入,采用acess函数实现函数的文件名的判断,若不存在创建管道,否则创建失败。创建完管道后的操作,就完全类似于文件的操作了。打开管道后,就可以向管道中写入数据了。
版权声明:本文为博主原创文章,未经博主允许不得转载。

linux进程通信----FIFO(有名管道)

无名管道只能用在具有亲缘关系的进程之间,这样就大大限制了管道的使用。有名管道突破了这种限制,可以实现互不相关的进程实现彼此的通信,管道可以通过路径名指定,在系统是可见的,建立管道之后就可以想普通文件一...

linux进程通信-有名管道

1.核心理论: 有名管道:有名管道又称FIFO文件,因此我们对有名管道的操作可以采用操作文件的方法,如使用open 、read 、write等函数。 fifo文件与普通文件的对比 FIFO文件 ...

Linux c==进程通信--有名管道(4)

命名管道和无名管道基本相同,但也有不同点:无名管道只能由父子进程使用; 但是通过命名管道,不相关的进程也能交换数据。 命名管道的使用创建管道mkfifo 打开管道open 读管道read ...

Linux进程通信 有名管道实现守护进程

有名管道实现守护进程 问题:如果一个进程出现了问题怎么判断它是否在运行?能否重启这个进程?尝试用守护进程操作。   解决方案:有名管道实现守护进程          守护进程(主进程)一直读取...

Linux进程通信(无名管道,有名管道,共享内存)的实现

Linux进程的通信有很多种方式,比如无名管道,有名管道,共享内存,Android进程通信采用的确是Binder机制~~~    在学习进程通信之前先学习一下System,Fork,Execive的...
  • szqsdq
  • szqsdq
  • 2015年09月17日 16:11
  • 625

进程通信--有名管道

命名管道和无名管道基本相同,但也有不同点:无名管道只能由父子进程使用; 但是通过命名管道,不相关的进程也能交换数据。 命名管道的使用创建管道mkfifo 打开管道open 读管道read 写管道...
  • jxm_96
  • jxm_96
  • 2016年10月25日 14:31
  • 153

【进程通信】无名管道 and 有名管道

管道通信分为无名管道和有名管道。   无名管道用于父进程和子进程间的通信,有名管道可用于运行于同一系统中的任意两个进程间的通信。 管道的特点:  ①半双工,数据只能向一个方向流动;需要双方通信时...

【Linux系统编程】进程间通信--有名管道

命名管道的概述 无名管道,由于没有名字,只能用于亲缘关系的进程间通信(更多详情,请看《无名管道》)。为了克服这个缺点,提出了命名管道(FIFO),也叫有名管道、FIFO 文件。 命名管道(...

Linux环境进程间通信(二):有名管道(FIFO)

转自:https://www.ibm.com/developerworks/cn/linux/l-ipc/part1/ 1 有名管道相关的关键概念 管道应用的一个重大限制是它没有名字,因此,只能用...

Linux环境进程间通信之有名管道(FIFO)的注意事项

1. FIFO文件是受内核保护的,所以程序在执行的时候需要Root权限,否则会提示错误:EACCES 2. 程序执行时,需要创建一个FIFO文件,结束之后应该予以删除,避免造成垃圾文件 3. 除了...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux进程通信--有名管道
举报原因:
原因补充:

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