linux进程通信中有名管道的特点,linux进程通信之(四):有名管道的读与写
前面我们说了无名管道,下面我们来说说有名管道,请看下面一段代码:
fifo_write.c:
#include#include#include#include#include#include#include#define FIFO "/tmp/myfifo"
void main(int argc,char **argv)//参数为即将写入的字节数
{
int fd;
char w_buf[100];
int nwrite;
if(fd==-1)
{
if(errno==ENXIO)
{
printf("open error;no reading process \n");
}
}
//fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);//打开FIFO管道,并设置非阻塞状态
fd=open(FIFO,O_WRONLY|O_NONBLOCK,0);
if(argc==1)
{
printf("please send something \n");
}
strcpy(w_buf,argv[1]);
if((nwrite=write(fd,w_buf,100))==-1)//向管道中写入字符串
{
if(errno==EAGAIN)
{
printf("the fifo has not been read yet.please try later\n");
}
}
else
{
printf("write %s to the fifo \n",w_buf) ;
}
}
/*------------------------------------------------------------
1.有名管道说明
它可以使互不相关的两个进程实现彼此通信.该管道可以通过路径名来指出,并且在文件系
统中是可见的.在建立管道之后,两个进程就可以把它当作普通文件一样进行读写操作,使用
方便.不过值得注意的是,FIFO是严格地遵循先进先出规则的,对管道及FIFO的读总是从开始处
返回数据,对它们的写则把数据添加到末尾,它们不支持如lseek()等文件定位操作.
2.有名管道的创建可以使用函数mkfifo(),该函数类似文件中的open()操作,可以指定管道的
路径和打开的模式.
在创建管道成功之后,就可以使用open,read,write这些函数了.与普通文件的开发设置一样,
对于为读而开的管道可在open中设置O_RDONLY,对于为写而打开的管道可在open中设置O_WRONLY,
在这里与普通文件不同的是阻塞的可能.由于普通文件的读写时不会出现阻塞问题,而
在管道的读写中却有阻塞的可能,这里的非阻塞标志可以在open函数中设定为O_NONBLOCK.
对于读进程
.若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞直到有数据写入.
.若该管道是非阻塞打开,则无论FIFO内是否有数据,读进程都会立即执行读操作.
对于写进程
.若该管道是阻塞打开,则写进程而言将一直阻塞直到有读进程读出数据.
.若该管道是非阻塞打开,则当前FIFO内没有读操作,写进程都会立即执行读操作.
3.mkfifo函数格式
1)所需要的头文件
#include#include2)函数原型
int mkfifo(const char *filename,mode_t mode)
3)函数输入参数
filename:要创建的管道
mode:
O_RDONLY:读管道
O_WRONLY:写管道
O_RDWR:读写管道
O_NONBLOCK:非阻塞
O_CREAT:如果该文件不存在,那么就创建一个新的文件,并用第三的参数为其设置权限.
O_EXCL:如果使用O_CREAT时文件存在,那么可返回错误消息.这一参数可测试文件是否
存在.
4)函数返回值
成功:0
出错:-1
4.实验
本实例需要两个程序,一个用于读管道,另一个用于写管道.其中在写管道的程序里创建
管道,并且作为main函数里的参数由用户输入要写入的内容.读管道读出了用户写入管道
的内容.
1)[root@localhost the_eight_step]# gcc fifo_write.c -o fifo_write
2)[root@localhost the_eight_step]# ./fifo_write hello
write hello to the fifo
3)[root@localhost the_eight_step]# gcc fifo_read.c -o fifo_read
4)[root@localhost the_eight_step]# ./fifo_read
perparing for reading bytes ...
read from fifo
read from fifo
read from fifo
read from fifo
read hello from fifo
5)注意:要打开两个终端去观察两个程序的运行情况.
----------------------------------------------------------*/
fifo_read.c:
#include#include#include#include#include#include#include#define FIFO "/tmp/myfifo"
void main(int argc,char **argv)
{
char buf_r[100];
int fd;
int nread;
if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))//创建有名管道,并
//设置相应的权限
{
printf("cannot create fifoserver \n");
}
printf("perparing for reading bytes ... \n");
memset(buf_r,0,sizeof(buf_r));
fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);//打开有名管道,并设置为非阻塞方式
if(fd==-1)
{
perror("open");
exit(1);
}
while(1)
{
memset(buf_r,0,sizeof(buf_r));
if((nread=read(fd,buf_r,100))==-1)
{
if(errno==EAGAIN)
{
printf("no data yet \n");
}
}
printf("read %s from fifo \n",buf_r);
sleep(1);
}
pause();
unlink(FIFO);
}
/*--------------------------------------------
notes:
1.unlink(删除文件)
1)所需要的头文件:#include2)函数原型:int unlink(const char *pthname)
3)函数说明:unlink()会删除参数pthbame指定的文件,如果该文件名为最后连接点,但有其他进程
打开此文件,则在所有关于此文件的文件描述词皆关闭后才会删除.如果参数pathname为一符号连
接,则此连接会被删除.
4)返回值
成功则返回0
失败返回-1
错误原因存于errno
2.pause(让进程暂停直到信号出现)
1)所需要的头文件:#include2)函数原型:int pause(void)
3)函数说明:pause()会令目前的进程暂停(进入睡眠状态),直到被信号(signal)所中断.
4)返回值
只返回-1
错误代码EINTR有信号到达中断了此函数
------------------------------------------------*/
linux进程通信中有名管道的特点,linux进程通信之(四):有名管道的读与写相关推荐
- 诚之和:在 Linux 和 Windows 中快速找到 Java 应用程序进程 ID
在这篇文章中,我们将讨论如何快速找到您的 Java 应用程序进程 ID.对于某些监控工具(如yCrash ),您需要将应用程序进程 ID 作为输入传递.如果您想查找包含多个不同选项的更详细的帖子来 ...
- 平时用到那些linux命令,工作中经常用到的linux命令,你知道多少?
①定时任务管理: crontab –l 查看定时任务 crontab -e 编辑定时任务 ②查看实时日志: tail -f changyues_api.log 实时查看log文件的更新 ③清空日志 e ...
- android alarmmanager进程,Android中使用AlarmManager需注意设置进程属性
Android中使用AlarmManager需注意设置进程属性 在Android中,AlarmManager提供了不受休眠状态的系统定时功能,其一般使用方法如下. 1.创建一个BroadcastRec ...
- linux面试题中的简答题,[计算机]linux面试题简答题部分.doc
[计算机]linux面试题简答题部分 linux面试题(简答题部分)2 简述进程的启动.终止的方式以及如何查看进程?答:启动进程的方式分为手动启动和自动启动两种方式,其中手动启动的方法用service ...
- linux启动过程中内核拷贝,轻松识破linux内核启动过程中的“”套路“”
内核启动流程相关的内容让很多热爱linux的小伙伴既爱又恨,因为这是了解linux系统基本构造的良好过程同时由于其本身复杂且底层,脑子中的脉络不是很清晰,本文就总结了一些优秀博文,以自己的理解来解构一 ...
- linux从表中提取信息,如何用Linux命令提取表格文本中的某列
文本文件x.txt内容如下: kaa a:\dkdkdk 123 dfdfdf b:\xxxxxxxxx 3234 j你好x c:\fdfdfv 打开 我现在要提取第二列,即: a:\dkdkdk b ...
- linux在文件中添加多行,关于linux:如何在文件中搜索多行模式?
我需要找到包含特定字符串模式的所有文件.首先想到的解决方案是使用find piped和xargs grep: find . -iname '*.py' | xargs grep -e 'YOUR_PA ...
- linux源码中ar8031驱动,AM335xd + KSZ8863RLL Linux网络底层驱动问题
开发平台AM335XD, 添加一款网络接口芯片 swith PHYs ksz8863RLL,百兆以太网模式, 接口为RMii, 原来开发版Linux内核配置的是一个千兆以太网PHY芯片 ar8031, ...
- linux查询日志中页面返回状态码,[linux shell] Shell脚本实现apache日志中的状态码分析...
这篇文章主要介绍了Shell脚本实现apache日志中的状态码分析,本文先是介绍了按天切割日志的方法,然后给出了分析访问状态码的脚本,需要的朋友可以参考下 一.首先将apache日志按天切割 复制代码 ...
- linux命令结果中获取某一列,Linux中 ls -l 命令显示结果中的每一列的含义
简单解释下: 1.第一列颜色框:文件类型列,这里简单描述几种常见类型,d表示目录文件,例如dr-xr-xr-x:-表示普通文件,例如-rwxrwxr-x. 2.第二三四列颜色框:文件权限列,因为lin ...
最新文章
- Oracle常用查看表结构命令
- HTTP 错误 404.3 - Forbidden
- cef在android中使用_嵌入Chrome cef之完整版(本教程基于cef1)
- mysql切换用户命令_linux基础04:linux用户相关的命令有哪些?怎样切换用户?
- 标记一下 两个Google Chrome 源码研究的网站
- django2连接mysql_Django2.2连接MySQL问题解决
- 巾帼不让须眉——女生做运维,一样可以很好
- 正确的python变量名_Python变量的命名
- 2014年度江西省高等学校科技落地计划项目立项名单
- eNSP创建局域网vlan隔离
- shell脚本快速执行命令
- 游戏出海Get,TikTok联手Zynga推出一款基于HTML5打造的手机游戏
- 001-三阶魔方-概述及层先法
- win10强制关闭飞行模式_win10笔记本突然连不上wifi怎么办?
- 荷包app软件测试,智能分贝测试仪app
- TCGA数据下载教程:使用官方gdc-client软件下载
- 宏基aspire拆机触摸_ACER 4736ZG拆机过程 (附图)
- 北京一日行之十五——八达岭野生动物园
- STM32与Futaba遥控器进行S.Bus的通讯程序
- 【CrowS-Pairs: A Challenge Dataset for Measuring Social Biases in Masked Language Models 论文精读】
热门文章
- Java基础学习总结(66)——配置管理库typesafe.config教程
- 当你学不进去的时候 不妨看看大脑是怎么想的
- python内置json模块_python的常用内置模块之序列化模块json
- php 截取base64内容,PHP-从长文本中删除Base64字符串
- python正则_正则化方法及Python实现
- 中国强制应用市场下架所有非认证开发者提交的应用
- python实现合并两个文件并打印输出
- http与websocket(基于SignalR)两种协议下的跨域基于ASP.NET MVC--竹子整理
- H264 profile and level
- CentOS下安装SecureCRT的sz/rz工具包