一、任务

1、学习mkfifo等函数;

2、了解有名管道的特点、阻塞打开与非阻塞打开等;

3、编写一个关于有名管道进程通信的程序,并运行。

二、相关概念

1、相关函数

创建有名管道的函数是mkfifo,函数原型是:

int mkfifo (const char *__path, __mode_t __mode)

功能:创建新的带命名路径的FIFO

参数:path — 命名管道路径

mode — 模式权限

返回值:成功返回0,失败返回-1;

2、有名管道的特点

a)、使不同进程之间完成通信。

通过mkfifo创建FIFO文件建立有名管道,

使得不同进程可以通过像访问文件的方式一样来访问有名管道,

fifo文件特点:先进先出:即写文件从有名管道数据尾端写入,数据读取从有名管道的开始处读取。

b)、有名管道内数据不支持如lseek()文件定位操作。

3、阻塞打开与非阻塞打开

对于读进程:

•若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入;

•若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果FIFO内没有数据,则读函数将立刻返回0、

对于写进程:

•若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入;

•若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。

三、实验代码及运行结果

1、代码

分别输入形成三个文件 mkfifo.c、client.c、service.c,代码如下:

  1. /*mkfifo.c*/
  2.  
  3. #include"stdio.h"
  4.  
  5. #include"unistd.h"
  6.  
  7. int main()
  8.  
  9. {
  10.  
  11. int ret;
  12.  
  13. ret=mkfifo("./a.c",0777);
  14.  
  15. if(ret<0)
  16.  
  17. {
  18.  
  19. printf("creat fifo a.c failure\n");
  20.  
  21. return -1;
  22.  
  23. }
  24.  
  25. printf("creat mkfifo.c sucess\n");
  26.  
  27. return 0;
  28.  
  29. }
  1. /*service.c*/
  2.  
  3. #include"unistd.h"
  4.  
  5. #include"fcntl.h"
  6.  
  7. #include"stdio.h"
  8.  
  9. #include"stdlib.h"
  10.  
  11. #include"string.h"
  12.  
  13. int main()
  14.  
  15. {
  16.  
  17. int fd;
  18.  
  19. char rdbuf[128]={0};
  20.  
  21. fd=open("./a.c",O_RDONLY);
  22.  
  23. if(fd<0)
  24.  
  25. {
  26.  
  27. printf("open fifo a.c failure\n");
  28.  
  29. return -1;
  30.  
  31. }
  32.  
  33. while(1)
  34.  
  35. {
  36.  
  37. read(fd,rdbuf,128);
  38.  
  39. printf("recv from fifo data:%s",rdbuf);
  40.  
  41. if(!strcmp(rdbuf,"quit\n"))
  42.  
  43. break;
  44.  
  45. memset(rdbuf,0,128);
  46.  
  47. }
  48.  
  49. sleep(1);
  50.  
  51. close(fd);
  52.  
  53. return 0;
  54.  
  55. }
  1. /*client.c*/
  2.  
  3. #include"unistd.h"
  4.  
  5. #include"fcntl.h"
  6.  
  7. #include"stdio.h"
  8.  
  9. #include"stdlib.h"
  10.  
  11. #include"string.h"
  12.  
  13. int main()
  14.  
  15. {
  16.  
  17. int fd;
  18.  
  19. char wrbuf[128];
  20.  
  21. fd=open("./a.c",O_WRONLY);
  22.  
  23. if(fd<0)
  24.  
  25. {
  26.  
  27. printf("open fifo a.c failure\n");
  28.  
  29. return -1;
  30.  
  31. }
  32.  
  33. while(1)
  34.  
  35. {
  36.  
  37. memset(wrbuf,0,sizeof(wrbuf));
  38.  
  39. fgets(wrbuf,128,stdin);
  40.  
  41. write(fd,wrbuf,strlen(wrbuf));
  42.  
  43. if(!strcmp(wrbuf,"quit\n"))
  44.  
  45. {
  46.  
  47. break;
  48.  
  49. }
  50.  
  51. }
  52.  
  53. sleep(1);
  54.  
  55. close(fd);
  56.  
  57. return 0;
  58.  
  59. }

2、编译运行

1)、生成可执行文件

终端输入:

gcc mkfifo.c -o mkfifo

gcc service.c -o service

gcc client.c -o client

2)、运行

先运行mkfifo,终端输入: ./mkfifo

打开两个终端分别运行 service、client

终端分别输入 :  ./service       ./client

即可实现通信!

linux下有名管道进程通信的更多相关文章

  1. Linux下简单的socket通信实例

    Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...

  2. Linux下查看某个进程打开的文件数-losf工具常用参数介绍

    Linux下查看某个进程打开的文件数-losf工具常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在linux操作系统中,一切皆文件.通过文件不仅仅可以访问常规数据,还 ...

  3. Linux下的管道命令有这些:

    Linux下的管道命令有这些: 选取命令:cat grep 排序命令:sort wc uniq 双向重定向:tee 字符转换命令: tr, col, join, paste, expand 切割命令: ...

  4. windows和linux下关闭Tomcat进程

    windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...

  5. linux下的qt串口通信

    1.linux下的qt串口通信跟windows唯一的差别就是端口号的名字,windows下面是COM,而linux是ttyUSB0的路径 2.一般情况下linux插上USB转串口线就可以在/dev/目 ...

  6. Linux 下smi/mdio总线通信

    Linux 下smi/mdio总线通信 韩大卫@吉林师范大学 下面代码描述了在用户层访问smi/mdio总线, 读写phy芯片寄存器的通用代码.Linux内核2.6以上通用. 将下面代码编译后,将可执 ...

  7. Linux下分析某个进程CPU占用率高的原因

      Linux下分析某个进程CPU占用率高的原因 通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用  1.top 查到占用cpu高的进程pid 2.查看该pid的线程 ...

  8. 解决linux下tomcat停止进程任存在问题

    解决linux下tomcat停止进程任存在问题 在Linux下(之所以强调linux下,是因为在windows下正常),执行tomcat ./shutdown.sh 后,虽然tomcat服务不能正常访 ...

  9. windows和linux下杀死Tomcat进程,解决端口占用

    windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...

随机推荐

  1. cf1000E We Need More Bosses (tarjan缩点+树的直径)

    题意:无向联通图,求一条最长的路径,路径长度定义为u到v必须经过的边的个数 如果把强联通分量都缩成一个点以后,每个点内部的边都是可替代的:而又因为这是个无向图,缩完点以后就是棵树,跑两遍dfs求直径即 ...

  2. layer 弹出层

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. hdu 4283"You Are the One"(区间DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 有n个屌丝排成一排,每个屌丝都有一个不开心值a[ i ]( i=1,2,3,.. ...

  4. 安卓和java开发环境的安装

    java配置安卓需要,sdk,jdk(java),adt,eclipse 对于jdk的配置和安装: 1 卸载原来的jdk,重新配置环境变量只需要:在系统变量中把新的jdkJ安装路径写到“JAVA_HO ...

  5. 记cccc天梯赛第三届决赛

        首先我很想知道,为什么我没有参加初赛,就可以去决赛,这个究竟有没有初赛,这真是未解之谜.     其次,会长说得不错,菜是原罪.不知道这次的表现能不能把我送去湘潭挑战赛....     我身边 ...

  6. TCP多线程聊天室

    TCP协议,一个服务器(ServerSocket)只服务于一个客户端(Socket),那么可以通过ServerSocket+Thread的方式,实现一个服务器服务于多个客户端. 多线程服务器实现原理— ...

  7. Lucene的其他搜索(三)

    生成索引: package com.wp.search; import java.nio.file.Paths; import org.apache.lucene.analysis.Analyzer; ...

  8. CodeForces165E 位运算 贪心 + 状压dp

    http://codeforces.com/problemset/problem/165/E 题意 两个整数 x 和 y 是 兼容的,如果它们的位运算 "AND" 结果等于 0,亦 ...

  9. HDFS集群优化篇

    HDFS集群优化篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.操作系统级别优化 1>.优化文件系统(推荐使用EXT4和XFS文件系统,相比较而言,更推荐后者,因为XF ...

  10. js和jQuery中的事件绑定与普通事件

    普通事件,是指直接对元素进行事件注册,然后触发 而事件绑定是将事件注册到元素上 两者区别就是在于普通事件不可以重复添加多个事件,若添加也会覆盖,只会触发其中一个事件(最后注册的那个) 而事件绑定是可以 ...