一、任务

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,代码如下:

/*mkfifo.c*/

#include"stdio.h"

#include"unistd.h"

int main()

{

       int ret;

       ret=mkfifo("./a.c",0777);

       if(ret<0)

       {

              printf("creat fifo a.c failure\n");

              return -1;

       }

       printf("creat mkfifo.c sucess\n");

       return 0;

}
/*service.c*/

#include"unistd.h"

#include"fcntl.h"

#include"stdio.h"

#include"stdlib.h"

#include"string.h"

int main()

{

       int fd;

       char rdbuf[128]={0};

       fd=open("./a.c",O_RDONLY);

       if(fd<0)

       {

              printf("open fifo a.c failure\n");

              return -1;

       }

       while(1)

       {

              read(fd,rdbuf,128);

              printf("recv from fifo data:%s",rdbuf);

              if(!strcmp(rdbuf,"quit\n"))

              break;

              memset(rdbuf,0,128);

       }

       sleep(1);

       close(fd);

       return 0;

}
/*client.c*/

#include"unistd.h"

#include"fcntl.h"

#include"stdio.h"

#include"stdlib.h"

#include"string.h"

int main()

{

int fd;

char wrbuf[128];

fd=open("./a.c",O_WRONLY);

if(fd<0)

{

       printf("open fifo a.c failure\n");

       return -1;

}

while(1)

{

       memset(wrbuf,0,sizeof(wrbuf));

       fgets(wrbuf,128,stdin);

       write(fd,wrbuf,strlen(wrbuf));

       if(!strcmp(wrbuf,"quit\n"))

       {

              break;

       }

}

sleep(1);

close(fd);

return 0;

}

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. 洛谷 P4705 玩游戏 解题报告

    P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...

  2. javascript正则表达式---正向预查

    什么是正向预查?这里有腾讯招聘的一个例子: 如何给一串数字用千分制表示?比如9999999999变成9,999,999,999.这样一个问题你会怎么答呢?博主js正则学的不咋样,然后用操作字符串的办法 ...

  3. 【codevs4927】线段树练习

    题目大意:维护一个序列,支持区间加.区间染色.区间最值查询.区间和查询. 题解:对于区间赋值操作来说,维护一个赋值标记,注意,这里不能直接用赋值的值直接维护,因为不像加法标记,0 表示不用处理,这里 ...

  4. Day29--Python--缓冲区, 粘包

    tcp: 属于长连接,与一个客户端进行连接了以后,其他的客户端要等待.要想连接另外一个客户端,需要优雅地断开当前客户端的连接 允许地址重用:server.setsockopt(socket.SOL_S ...

  5. python 字典的定义以及方法

    7.字典的转换: dict(x=1,y=2)  ==>  {'y': 2, 'x': 1} dict([(i,element) for i, element in enumerate(['one ...

  6. NOIP 普及组 2012 寻宝(思维???)

    传送门 https://www.cnblogs.com/violet-acmer/p/9937201.html 题解: 一开始用暴力查找下一个要去的房间,超时了,emmmmm....... 然后,就稍 ...

  7. 拆分字符串法 获取url的GET参数

    function serilizeURL(url){ var rs=url.split("?")[1]; var arr=rs.split("&"); ...

  8. POJ 3522 Slim Span(极差最小生成树)

    Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 9546   Accepted: 5076 Descrip ...

  9. 【清北学堂2018-刷题冲刺】Contest 5

     这三个题写了一天半,第一个题写了大概一整天.出题人劝我从后往前写,我不听,结果T1想了+调了一天QWQWQ Task 1:序列 [问题描述]  定义一个"好的序列"为一个长度为M ...

  10. 列举一些 MacBook Pro 必需的外设和应用程序推荐

    来源:知乎 文章收录于:风云社区SCOEE,提供上千款mac软件下载 基于从事Apps设计或开发者,使用 MacBook Pro,以下罗列一些必需的外设和应用程序推荐. Retina 256GB SS ...