linux下有名管道进程通信
一、任务
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下有名管道进程通信的更多相关文章
- Linux下简单的socket通信实例
Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...
- Linux下查看某个进程打开的文件数-losf工具常用参数介绍
Linux下查看某个进程打开的文件数-losf工具常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在linux操作系统中,一切皆文件.通过文件不仅仅可以访问常规数据,还 ...
- Linux下的管道命令有这些:
Linux下的管道命令有这些: 选取命令:cat grep 排序命令:sort wc uniq 双向重定向:tee 字符转换命令: tr, col, join, paste, expand 切割命令: ...
- windows和linux下关闭Tomcat进程
windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...
- linux下的qt串口通信
1.linux下的qt串口通信跟windows唯一的差别就是端口号的名字,windows下面是COM,而linux是ttyUSB0的路径 2.一般情况下linux插上USB转串口线就可以在/dev/目 ...
- Linux 下smi/mdio总线通信
Linux 下smi/mdio总线通信 韩大卫@吉林师范大学 下面代码描述了在用户层访问smi/mdio总线, 读写phy芯片寄存器的通用代码.Linux内核2.6以上通用. 将下面代码编译后,将可执 ...
- Linux下分析某个进程CPU占用率高的原因
Linux下分析某个进程CPU占用率高的原因 通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用 1.top 查到占用cpu高的进程pid 2.查看该pid的线程 ...
- 解决linux下tomcat停止进程任存在问题
解决linux下tomcat停止进程任存在问题 在Linux下(之所以强调linux下,是因为在windows下正常),执行tomcat ./shutdown.sh 后,虽然tomcat服务不能正常访 ...
- windows和linux下杀死Tomcat进程,解决端口占用
windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...
随机推荐
- CANOE入门(一)
CANoe是Vector公司的针对汽车电子行业的总线分析工具,现在我用CANoe7.6版本进行介绍,其他版本功能基本差不多. 硬件我使用的是CAN case XL. 1,CANoe软件的安装很简单,先 ...
- jquery $().each,$.each的区别
在jquery中,遍历对象和数组,经常会用到$().each和$.each(),两个方法. 两个方法是有区别的,从而这两个方法在针对不同的操作上,显示了各自的特点. 一,$().each $().ea ...
- flask Blueprint蓝图
首先要了解蓝图的作用,模拟场景在团队开发过程中团队每个人都在写自己负责的功能模块,那多个py文件模板,我们如果完成后需要运行是不是要运行多个服务?但是我们的项目是一个整体,而不是零散的,所以我们怎么把 ...
- 关于dp(背包)
有关背包,我这几天可是尽受其苦(不得不靠我聪颖的背诵代码的大脑来进行一波操作) Step 1 01背包 关于01背包的主要代码: ;j<=m;j++) { for(int i=n;i& ...
- IntelliJ IDEA Cannot resolve symbol ''
study from : https://www.cnblogs.com/linmengfei/p/7909196.html File->Invalidate Caches 点击File | I ...
- python 类的介绍
使用面向对象的优点: 1.能够更好的设计软件架构 2.维护软件模块 3.易于架构和组件的重用 类的定义: 构造函数:初始化用,写不写都可以,默认为空 类属性:属于类的对象 方法属性:不属于类的对象 私 ...
- VMware for mac inside error solutions
Terminal 下执行 sudo xattr -r -d com.apple.quarantine /Applications/VMware\ Fusion.app 之后就能正常打开镜像安装虚拟机了 ...
- Linux 多线程 - 线程异步与同步机制
Linux 多线程 - 线程异步与同步机制 I. 同步机制 线程间的同步机制主要包括三个: 互斥锁:以排他的方式,防止共享资源被并发访问:互斥锁为二元变量, 状态为0-开锁.1-上锁;开锁必须由上锁的 ...
- CodeForces1051F LCA + Floyd
题意:给定一个10W的无向联通图,和10W的询问,每个询问求任意两点间的距离,限制条件是边数-点数不超过20 一般来说图上任意两点间的距离都会采用Floyd算法直接做,但是这个数据范围显然是不合理的, ...
- JAVA-比较浮点型数据
Float public static void main(String[] args) { Float x = 12.4F; Float y = 12.4F; // 比较对象地址 System.ou ...