20命名管道

命名管道 FIFO  (First In First Out)

命令行: mknod

mknod  [-m mode]  NAME  TYPE  [  MAJOR  MINOR]

mknod    name    b | c   major  minor  //块设备,字符设备文件

mknod    name    p                              //管道文件

mknod    name    s                              //信号量

mknod    name    m                             //共享内存

命令行:mkfifo   (first input first output)

mkfifo  [-m mode]  name                  //创建命名管道

mode 即文件访问权限,  如 mkfifo –m 644 k2

命令行测试管道通信

mknod  pnod p

tty1:   cat pnod

tty2:   echo Message > pnod

注:管道无内容时,读阻塞;管道写入内容,没有读出之前,写阻塞

管道创建函数

<sys/types.h>

<sys/stat.h>

int  mkfifo (const char *pathname, mode_t mode)

和命令行一样:

向管道中写入数据后,没有被读出,则阻塞

从管道中读出数据时,如果没数据,则阻塞

思路:

命名管道文件使用,和读写文件操作类似, 步骤如下:

1: 创建管道文件   mkfifo()

2: 打开管道

进程a:只读打开管道文件  open 或 fopen

进程b:只写打开管道文件

3: 读写管道

进程a:读管道  read,     fread

进程b:写管道  write,    fwrite

4: 关闭管道         close,     fclose

管道模型

1-1 模型

两个进程间双向通信

需要两个管道

n-1 模型

非交互式服务:多个客户端向服务端发送消息

1 个管道,客户端向服务端单向通信

n-1-n 模型

交互式服务:

1:多个客户端 共用管道向服务端发送消息

2:服务端通过专用管道向客户端发送消息

例子:两个进程间通信,要启动两次程序,只有单向通信。

#include <stdio.h>

#include <fcntl.h>

#include <string.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/stat.h>

void testPipe()

{

char cMode;

fprintf(stderr,"select the mode:w/r:");

cMode=getchar();

char szFile[128]={"pnod"};

int fd;

int len;

char szBuf[1024];

struct stat info;

//不存在名为pnod的文件

if(!stat(szFile,&info))

{

//创建名为pnod的管道文件

if(!mkfifo(szFile,0664))

{

perror("fail mkfifo!");

return ;

}

}

//存在该文件,但不是管道文件

else if(!S_ISFIFO(info.st_mode))

{

perror("this is not a pipe file");

return ;

}

//接受方

if(cMode==‘r‘)

{

//打开文件,返回文件描述符

fd=open(szFile,O_RDONLY);

if(fd<0)

{

perror("fail open!");

return ;

}

while(1)

{

memset(szBuf,0,sizeof(szBuf));

len=read(fd,szBuf,sizeof(szBuf));

if(len<0)

{

perror("fail to read file!");

return ;

}

else if(len==0)

{

printf("FIFO closed!\n");

return ;

}

else

{

printf("receive:%s",szBuf);

}

}

close(fd);

}

//发送方

else if(cMode==‘w‘)

{

fd=open(szFile,O_WRONLY);

if(fd<0)

{

perror("fail open!");

return ;

}

while(1)

{

fprintf(stderr,"Send:");

memset(szBuf,0,sizeof(szBuf));

read(0,szBuf,sizeof(szBuf));

write(fd,szBuf,strlen(szBuf));

}

close(fd);

}

else

{

return ;

}

}

int main()

{

testPipe();

return 0;

}

原文地址:https://www.cnblogs.com/gd-luojialin/p/9216013.html

时间: 2024-10-31 18:35:30

20命名管道的相关文章

windows namedPipe 命名管道clent and server

1.client: 1 #include "iostream" 2 #include "windows.h" 3 4 using namespace std; 5 void main(int argc,char* argv[]) 6 { 7 LPCTSTR Message="the pipe's message from a client to server."; 8 if(argc==2) 9 Message=argv[1]; 10 DWORD

Windows进程间通信—命名管道

命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节.我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信.与Socket网络通信相比,命名管道不再需要编写身份验证的代码.将命名管道作为一种网络编程方案时,它实际上建立了一个C/S通信体系,并在其中可靠的传输数据.命名管道服务器和客户机的区别在于:服务器是唯一一个有权创建命名管道的进程,也只有它能接受管道客户机的连接请求.而客户机只能同一个现成的命名管道服务器建立连接.命名管道服务器只能在WindowsNT或Window

进程间通信(5) - 命名管道(FIFO)

1. 前言 本篇文章的所有例子,基于RHEL6.5平台.前一篇文章介绍了匿名管道.点此链接. 2.介绍 管道应用的一个重大限制是它没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(named pipe或FIFO)提出后,该限制得到了克服.FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中.这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,

利用命名管道实现进程间的通信(简单聊天程序的实现)

管道的本质是一种文件,通常是指把一个进程的输出直接传递给另一个进程的输入. 命名管道(named pipe)是一种特殊的文件类型(FIFO文件),它在文件系统中以文件名的形式存在. 下面是Linux中命名管道的文件格式: 通过命令行创建命名管道可以通过mkfifo命令,函数调用如下所示: 1 #include <sys/types.h> 2 #include <sys/stat.h> 3 4 int mkfifo(const char *filename,mode_t mode);

进程间通信(1)---匿名管道与命名管道

管道是进程间通信一种基本的的一种方式,管道又分为两种,匿名管道和命名管道,先说匿名管道 匿名管道(pipe) #include <unistd.h> int pipe(int filedes[2]); 调用pipe时会在内核中开辟一个缓冲区,使用时fileds[0]为输出端,fileds[1]为写入端口,调用成功时返回0,失败时返回-1: pipe的特点: 1:它只能在有血缘关系的进程间进行通信. 2:它只能进行单项通信,一个进程读,另一个只能写. 3:它是一种流式服务. 4:它的生命周期跟随

C#的命名管道(named pipe)

命名管道是一种从一个进程到另一个进程用内核对象来进行信息传输.和一般的管道不同,命名管道可以被不同进程以不同的方式方法调用(可以跨权限.跨语言.跨平台).只要程序知道命名管道的名字,发送到命名管道里的信息可以被一切拥有指定授权的程序读取,但对不具有制定授权的.命名管道是一种FIFO(先进先出,First-In First-Out)对象. 我们可以使用命名管道在2个不同的进程中进行通信而不需要通过一般的IO读写文件来获取信息. 在C#中可以简单的这么用用来接收消息 using System.IO.

进程间通信IPC—匿名管道(pipe)和命名管道(fifo)

管道内部如何实现-大小,组织方式,环形队列? 一.进程间通信有多种方式,本文主要讲解对管道的理解.管道分为匿名管道和命名管道. (1)管道( pipe ):又称匿名管道.是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. (2)命名管道 (named pipe或FIFO) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信. 二.管道 1. 管道的特点: (1)管道是半双工的,数据只能向一个方向流动:双方通信时,需要

【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行

背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比如最大在100Mb/s,如果直接启动100个scp,则又会遇到ssh的并发连接数限制. 所以需要控制并发数,即不超过ssh的并发限制,又要让单网卡上的带宽接近饱和,尽快完成传输(假设专线带宽远大于单机网卡带宽) 实现 之前知道通过mkfifo创建一个命名管道,可以实现对并发的控制.现在来实现一个.

Windows进程间通信--命名管道

1.相关概述 命名管道(Named Pipes)是一种简单的进程间通信(IPC)机制.命名管道可以在同一台计算机的不同进程之间,或者跨越一个网络的不同计算机的不同进程之间的可靠的双向或单向的数据通信. 命名管道利用了微软网络提供者(MSNP)重定向器,因此无需涉及底层的通信协议等细节.命名管道是围绕windows文件系统设计的一种机制,采用"命名管道文件系统"(Named Pipe File System,NPFS)接口.因此,客户端和服务端均可以使用标准的WIN32文件系统API函数