【第22期】观点:IT 行业加班,到底有没有价值?

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进程通信机制之无名管道&有名管道

前几天看看了linux多线程,最近就想看看linux进程间是如何通信的。 linux进程通信相比大家都是很熟悉了,在操作系统的教材上也早已列举出来这里咱们在回顾一下 linux进程通信方式: 1.管道...

Linux进程间通信(九)---综合实验之有名管道通信实验

实验目的 通过编写有名管道多路通信实验,进一步掌握管道的创建、读写等操作,同时复习使用select()函数实现管道的通信。 实验内容 这里采用管道函数创建有名管道(不是在控制台下输入命令mknod),而且使用select()函数替代poll()函数实现多路复

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

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

Linux进程的通信有很多种方式,比如无名管道,有名管道,共享内存,Android进程通信采用的确是Binder机制~~~    在学习进程通信之前先学习一下System,Fork,Execive的...

Linux操作系统分析(10) - 进程通信之管道与信号量

提要 Linux中进程间的通信机制主要有:管道FIFO,信号量,消息,共享内存区,套接字。程序员在使用中可以根据不同的需求进行选择。 管道 管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条。管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个...

Linux应用程序学习之进程通信之管道

Linux进程通信之管道 Linux中进程通信方式,即IPC通信方式主要有以下七种: (1)无名管道(pipe) (2)有名管道(FIFO) (3)信号 (4)消息队列 (5)共享内存 (6)信号量 ...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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