命名管道FIFO

简介:   首先我得检讨一下自己,这几天有些颓呀,打不起精神,板子出了点问题,果真自学还是很困难呀,硬件方面难解决呀,理想与现实还是很有差距的,伤透了,凌乱了。   一直在理解进程间通信的问题。发现上次忽略了一个问题,就是命名管道,命名管道和一般的管道有一些显著的不同: 1.FIFO是在文件系统中作为一个特殊的设备文件而存在的; 2.不同祖先的进程之间可以通过管道共享数据; 3.当共享管道的进程执行完所有的I/O操作后,FIFO将继续保存在文件系统中以便以后使用。

  首先我得检讨一下自己,这几天有些颓呀,打不起精神,板子出了点问题,果真自学还是很困难呀,硬件方面难解决呀,理想与现实还是很有差距的,伤透了,凌乱了。

  一直在理解进程间通信的问题。发现上次忽略了一个问题,就是命名管道,命名管道和一般的管道有一些显著的不同:

1.FIFO是在文件系统中作为一个特殊的设备文件而存在的;

2.不同祖先的进程之间可以通过管道共享数据;

3.当共享管道的进程执行完所有的I/O操作后,FIFO将继续保存在文件系统中以便以后使用。

  这里需要注意一下:管道只能由相关的进程使用,它们共同的祖先进程创建了管道,但是通过FIFO,不相关的进程也能交换数据。

  FIFO的创建:

#include <sys/types.h>

#include <sys/stat.h>

int mkfifo(const char * pathname,mode_t mode) ;

返回:若成功则为0,出错为-1;一旦已经mkfifo创建了一个FIFO,就可以open打开它。

 当打开一个FIFO时,非阻塞标志会产生如下影响:

(1)一般情况,只读打开要阻塞到某个其它进程为写打开此FIFO。类似,为写打开一个FIFO要阻塞到某个其它进程为读而打开它。

(2)如果指定非阻塞状态,则只读打开立即返回,但是如果没有进程已经为读而打开一个FIFO,那么只写打开将出错返回,其errno是ENXIO。

   类似于管道,若写一个尚无进程为读而打开的FIFO,则产生信号SIGPIPE。若某个FIFO的最后一个写进程关闭了该FIFO,则将为该FIFO的读进程产生一个文件结束标志。

  具体点代码如下:

 

 1 #include <sys/types.h>
 2 #include <sys/stat.h>
 3 #include <errno.h>
 4 #include <fcntl.h>
 5 #include <stdio.h>
 6 #include <stdlib.h>
 7 #include <string.h>
 8 #define FIFO "/tmp/myfifo"
 9 
10 main(int argc,char** argv)
11 {
12     char buf_r[100];
13     int  fd;
14     int  nread;
15     
16     if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))
17         printf("cannot create fifoserver\n");
18     printf("Preparing for reading bytes...\n");
19     
20     memset(buf_r,0,sizeof(buf_r));
21     fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);
22     if(fd==-1)
23     {
24         perror("open");
25         exit(1);    
26     }
27     while(1)
28     {
29         memset(buf_r,0,sizeof(buf_r));
30         
31         if((nread=read(fd,buf_r,100))==-1){
32             if(errno==EAGAIN)
33                 printf("no data yet\n");
34         }
35         printf("read %s from FIFO\n",buf_r);
36         sleep(1);
37     }    
38     pause();
39     unlink(FIFO);
40 }
fifo_read

 

 1 #include <sys/types.h>
 2 #include <sys/stat.h>
 3 #include <errno.h>
 4 #include <fcntl.h>
 5 #include <stdio.h>
 6 #include <stdlib.h>
 7 #include <string.h>
 8 #define FIFO_SERVER "/tmp/myfifo"
 9 
10 main(int argc,char** argv)
11 {
12     int fd;
13     char w_buf[100];
14     int nwrite;
15     
16     if(fd==-1)
17         if(errno==ENXIO)
18             printf("open error; no reading process\n");
19     fd=open(FIFO_SERVER,O_WRONLY|O_NONBLOCK,0);
20     if(argc==1)
21         printf("Please send something\n");
22     strcpy(w_buf,argv[1]);
23     if((nwrite=write(fd,w_buf,100))==-1)
24     {
25         if(errno==EAGAIN)
26             printf("The FIFO has not been read yet.Please try later\n");
27     }
28     else 
29         printf("write %s to the FIFO\n",w_buf);
30 }
fifo_write

 

相关文章
|
存储 数据处理 索引
Python操作Excel常用方法汇总
Python操作Excel常用方法汇总
440 0
|
消息中间件 SQL JSON
Flink问题之source并行度不同导致任务没有数据落地如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
483 0
|
10月前
|
Java
Java项目中高精度数值计算:为何BigDecimal优于Double
在Java项目开发中,涉及金额计算、面积计算等高精度数值操作时,应选择 `BigDecimal` 而非 `Double`。`BigDecimal` 提供任意精度的小数运算、多种舍入模式和良好的可读性,确保计算结果的准确性和可靠性。例如,在金额计算中,`BigDecimal` 可以精确到小数点后两位,而 `Double` 可能因精度问题导致结果不准确。
162 1
|
8月前
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
182 7
|
人工智能 数据可视化 API
10 分钟构建 AI 客服并应用到网站、钉钉或微信中测试评
10 分钟构建 AI 客服并应用到网站、钉钉或微信中测试评
300 2
|
设计模式 JavaScript 开发者
Vue设计模式:工厂模式
Vue设计模式:工厂模式
|
人工智能 运维 安全
首个民航机场大模型应用上线!
首个民航机场大模型应用上线!
283 2
|
存储 算法
数据结构练习题——树和二叉树(算法设计题)
以二叉链表作为二叉树的存储结构,编写以下算法: (1)统计二叉树的叶结点个数。 [题目分析]如果二叉树为空,返回0,如果二叉树不为空且左右子树为空,返回1,如果二叉树不为空,且左右子树不同时为空,返回左子树中叶子节点个数加上右子树中叶子节点个数。 [算法描述]
504 0
|
Java 开发工具
idea没有run怎么办
idea没有run怎么办
|
缓存 JavaScript 前端开发
浅谈Vue3中的组合式API
浅谈Vue3中的组合式API
332 2