前面我们说了无名管道,下面我们来说说有名管道,请看下面一段代码:

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进程通信之(四):有名管道的读与写相关推荐

  1. 诚之和:在 Linux 和 Windows 中快速找到 Java 应用程序进程 ID

    在这篇文章中,我们将讨论如何快速找到您的 Java 应用程序进程 ID.对于某些监控工具(如​yCrash ​),您需要将应用程序进程 ID 作为输入传递.如果您想查找包含多个不同选项的更详细的帖子来 ...

  2. 平时用到那些linux命令,工作中经常用到的linux命令,你知道多少?

    ①定时任务管理: crontab –l 查看定时任务 crontab -e 编辑定时任务 ②查看实时日志: tail -f changyues_api.log 实时查看log文件的更新 ③清空日志 e ...

  3. android alarmmanager进程,Android中使用AlarmManager需注意设置进程属性

    Android中使用AlarmManager需注意设置进程属性 在Android中,AlarmManager提供了不受休眠状态的系统定时功能,其一般使用方法如下. 1.创建一个BroadcastRec ...

  4. linux面试题中的简答题,[计算机]linux面试题简答题部分.doc

    [计算机]linux面试题简答题部分 linux面试题(简答题部分)2 简述进程的启动.终止的方式以及如何查看进程?答:启动进程的方式分为手动启动和自动启动两种方式,其中手动启动的方法用service ...

  5. linux启动过程中内核拷贝,轻松识破linux内核启动过程中的“”套路“”

    内核启动流程相关的内容让很多热爱linux的小伙伴既爱又恨,因为这是了解linux系统基本构造的良好过程同时由于其本身复杂且底层,脑子中的脉络不是很清晰,本文就总结了一些优秀博文,以自己的理解来解构一 ...

  6. linux从表中提取信息,如何用Linux命令提取表格文本中的某列

    文本文件x.txt内容如下: kaa a:\dkdkdk 123 dfdfdf b:\xxxxxxxxx 3234 j你好x c:\fdfdfv 打开 我现在要提取第二列,即: a:\dkdkdk b ...

  7. linux在文件中添加多行,关于linux:如何在文件中搜索多行模式?

    我需要找到包含特定字符串模式的所有文件.首先想到的解决方案是使用find piped和xargs grep: find . -iname '*.py' | xargs grep -e 'YOUR_PA ...

  8. linux源码中ar8031驱动,AM335xd + KSZ8863RLL Linux网络底层驱动问题

    开发平台AM335XD, 添加一款网络接口芯片 swith PHYs ksz8863RLL,百兆以太网模式, 接口为RMii, 原来开发版Linux内核配置的是一个千兆以太网PHY芯片 ar8031, ...

  9. linux查询日志中页面返回状态码,[linux shell] Shell脚本实现apache日志中的状态码分析...

    这篇文章主要介绍了Shell脚本实现apache日志中的状态码分析,本文先是介绍了按天切割日志的方法,然后给出了分析访问状态码的脚本,需要的朋友可以参考下 一.首先将apache日志按天切割 复制代码 ...

  10. linux命令结果中获取某一列,Linux中 ls -l 命令显示结果中的每一列的含义

    简单解释下: 1.第一列颜色框:文件类型列,这里简单描述几种常见类型,d表示目录文件,例如dr-xr-xr-x:-表示普通文件,例如-rwxrwxr-x. 2.第二三四列颜色框:文件权限列,因为lin ...

最新文章

  1. Oracle常用查看表结构命令
  2. HTTP 错误 404.3 - Forbidden
  3. cef在android中使用_嵌入Chrome cef之完整版(本教程基于cef1)
  4. mysql切换用户命令_linux基础04:linux用户相关的命令有哪些?怎样切换用户?
  5. 标记一下 两个Google Chrome 源码研究的网站
  6. django2连接mysql_Django2.2连接MySQL问题解决
  7. 巾帼不让须眉——女生做运维,一样可以很好
  8. 正确的python变量名_Python变量的命名
  9. 2014年度江西省高等学校科技落地计划项目立项名单
  10. eNSP创建局域网vlan隔离
  11. shell脚本快速执行命令
  12. 游戏出海Get,TikTok联手Zynga推出一款基于HTML5打造的手机游戏
  13. 001-三阶魔方-概述及层先法
  14. win10强制关闭飞行模式_win10笔记本突然连不上wifi怎么办?
  15. 荷包app软件测试,智能分贝测试仪app
  16. TCGA数据下载教程:使用官方gdc-client软件下载
  17. 宏基aspire拆机触摸_ACER 4736ZG拆机过程 (附图)
  18. 北京一日行之十五——八达岭野生动物园
  19. STM32与Futaba遥控器进行S.Bus的通讯程序
  20. 【CrowS-Pairs: A Challenge Dataset for Measuring Social Biases in Masked Language Models 论文精读】

热门文章

  1. Java基础学习总结(66)——配置管理库typesafe.config教程
  2. 当你学不进去的时候 不妨看看大脑是怎么想的
  3. python内置json模块_python的常用内置模块之序列化模块json
  4. php 截取base64内容,PHP-从长文本中删除Base64字符串
  5. python正则_正则化方法及Python实现
  6. 中国强制应用市场下架所有非认证开发者提交的应用
  7. python实现合并两个文件并打印输出
  8. http与websocket(基于SignalR)两种协议下的跨域基于ASP.NET MVC--竹子整理
  9. H264 profile and level
  10. CentOS下安装SecureCRT的sz/rz工具包