linux 命名管道实例详解

转载  更新时间:2017年06月22日 09:33:09   作者:魏尔肖   我要评论

这篇文章主要介绍了linux 命名管道实例详解的相关资料,需要的朋友可以参考下

linux进程间通信——命名管道

  FIFO(命名管道)不同于匿名管道之处在于它提供⼀个路径名与之关联,以FIFO的⽂件形式存储于⽂件系统中。命名管道是⼀个设备⽂件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信。值得注意的是,FIFO(first input first output)总是按照先进先出的原则⼯作,第⼀个被写⼊的数据将⾸先从管道中读出。

  创建命名管道的系统函数有两个:mknod和mkfifo。两个函数均定义在头⽂件sys/stat.h,函数原型如下:

#include <sys/types.h> 
#include <sys/stat.h> 
int mknod(const char *path,mode_t mod,dev_t dev); 
int mkfifo(const char *path,mode_t mode); 

   函数mknod参数中path为创建的命名管道的全路径名:mod为创建的命名管道的模式,指明其存取权限;dev为设备值,该值取决于⽂件创建的种类,它只在创建设备⽂件时才会⽤到。这两个函数调⽤成功都返回0,失败都返回-1。下⾯使⽤mknod函数创建了⼀个命名管道:

umask(0);

if (mknod("/tmp/fifo",S_IFIFO | 0666) == -1)

{

perror("mkfifo error");

exit(1);

} 

 函数mkfifo前两个参数的含义和mknod相同。下⾯是使⽤mkfifo的⽰例代码:

umask(0);

if (mkfifo("/tmp/fifo",S_IFIFO|0666) == -1)

{


perror("mkfifo error!");

exit(1);

}

下面为一个试例:

read端

#include<stdlib.h> 
#include<stdio.h> 
#include<sys/types.h> 
#include<sys/stat.h> 
#include<fcntl.h> 
#include<errno.h> 
#define PATH "./fifo" 
#define SIZE 128 
int main() 
{ 
 umask(0); 
 if (mkfifo (PATH,0666|S_IFIFO) == -1) 
 { 
 perror ("mkefifo error"); 
 exit(0); 
 } 
 int fd = open (PATH,O_RDONLY); 
 if (fd<0) 
 { 
  printf("open fd is error\n"); 
  return 0; 
 } 
 
 char Buf[SIZE]; 
 while(1){ 
 ssize_t s = read(fd,Buf,sizeof(Buf)); 
 if (s<0) 
 { 
  perror("read error"); 
  exit(1); 
 } 
 else if (s == 0) 
 { 
  printf("client quit! i shoud quit!\n"); 
  break; 
 } 
 else 
 { 
  Buf[s] = '\0'; 
  printf("client# %s ",Buf); 
  fflush(stdout); 
 } 
 } 
 close (fd); 
 return 3; 
} 

下面为weite端:

#include<stdlib.h> 
#include<stdio.h> 
#include<unistd.h> 
#include<sys/types.h> 
#include<sys/stat.h> 
#include<string.h> 
#include<errno.h> 
#include<fcntl.h> 
 
#define PATH "./fifo" 
#define SIZE 128 
int main() 
{ 
 int fd = open(PATH,O_WRONLY); 
 if (fd < 0) 
 { 
  perror("open error"); 
  exit(0); 
 } 
 
 char Buf[SIZE]; 
 while(1) 
 { 
  printf("please Enter#:"); 
  fflush(stdout); 
  ssize_t s = read(0,Buf,sizeof(Buf)); 
  if (s<0) 
  { 
   perror("read is failed"); 
   exit(1); 
  } 
  else if(s==0) 
  { 
   printf("read is closed!"); 
   return 1; 
  } 
  else{ 
   Buf[s]= '\0'; 
   write(fd,Buf,strlen(Buf)); 
  } 
 } 
 return 0; 
} 

打开两个终端:

 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Linux 查看cpu 信息的命令及简单实例

    Linux 查看cpu 信息的命令及简单实例

    这篇文章主要介绍了Linux 查看cpu 信息的命令及简单实例的相关资料,需要的朋友可以参考下
    2016-10-10
  • 在centos 7中安装配置k8s集群的步骤详解

    在centos 7中安装配置k8s集群的步骤详解

    这篇文章主要给大家介绍了关于在centos 7中安装配置k8s集群的步骤,文中通过示例代码将步骤介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习下吧。
    2017-09-09
  • 在linux服务器下使用版本控制软件SVN的方法

    在linux服务器下使用版本控制软件SVN的方法

    下面小编就为大家分享一篇在linux服务器下使用版本控制软件SVN的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • linux命令详解date使用方法(计算母亲节和父亲节日期脚本示例)

    linux命令详解date使用方法(计算母亲节和父亲节日期脚本示例)

    date命令可以用来显示和修改系统日期时间,本文对其做了详细说明,最近提供计算指定年份的母亲节和父亲节的日期脚本示例,大家参考使用吧
    2013-12-12
  • Linux将命令添加到PATH中的方法

    Linux将命令添加到PATH中的方法

    下面小编就为大家带来一篇Linux将命令添加到PATH中的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 详解linux 下安装软件tar.gz, rpm,deb的方法

    详解linux 下安装软件tar.gz, rpm,deb的方法

    本篇文章主要介绍了linux 下安装软件tar.gz, rpm,deb的方法 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-12-12
  • Linux基础学习之文件查找find的常见用法

    Linux基础学习之文件查找find的常见用法

    这篇文章主要给大家介绍了关于Linux基础学习之文件查找find的常见用法的相关资料,例如:根据文件名查找、根据正则表达式查找、根据路径查找、根据文件类型查找以及根据文件大小等等,文中给出了详细的示例代码,需要的朋友可以参考借鉴。
    2017-12-12
  • 在Ubunt16.04上安装LAMP的方法

    在Ubunt16.04上安装LAMP的方法

    这篇文章主要介绍了在Ubunt16.04上安装LAMP的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Linux中环境变量配置的步骤详解

    Linux中环境变量配置的步骤详解

    Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登录到系统的用户都要读取的系统变量,而用户级的环境变量则是该用户使用系统时加载的环境变量。所以下面这篇文章主要给大家介绍了关于Linux中环境变量配置的相关资料,需要的朋友可以参考下。
    2017-07-07
  • time_t tm timeval 和 时间字符串的转换方法

    time_t tm timeval 和 时间字符串的转换方法

    下面小编就为大家带来一篇time_t tm timeval 和 时间字符串的转换方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01

最新评论