命名管道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

 

相关文章
|
4月前
|
存储 缓存 算法
S3-FIFO
S3-FIFO
61 2
|
6月前
|
存储 安全 Python
进程通信 , 信号量 , 队列 , 管道 , 共享内存
进程通信 , 信号量 , 队列 , 管道 , 共享内存
|
7月前
|
消息中间件 Linux C语言
进程通信:管道与队列
进程通信:管道与队列
|
7月前
|
消息中间件 监控 Java
FIFO
FIFO
89 9
|
6月前
|
API 内存技术
无名管道&&有名管道详解代码
无名管道&&有名管道详解代码
|
7月前
|
Linux C语言
Linux进程间通信(fifo有名管道)
Linux进程间通信(fifo有名管道)
260 0
|
消息中间件 Unix Linux
进程间通信之管道(匿名管道与命名管道)
首先我们先提出一个问题:进程之间为什么无法直接通信,而需要操作系统提供通信方式: 经过我们上一个博客学习我们可以知道,每个进程都有独立的虚拟地址空间,一个进程在访问一个数据的时候都是通过地址来进行访问的,进过页表映射在之后访问物理内存,因此如果想要给另一个进程传递一个数据,就要把它的地址空间传递给其他进程,因为a进程的是虚拟地址,所以b进程经过页表映射也访问不了。(这个设计的初衷是:独立虚拟空间可以更稳定)
378 0
|
Linux
Linux进程通信之管道(FIFO)
Linux进程通信之管道(FIFO)
106 0
|
Linux Shell
【Linux进程间通信】三、FIFO命名管道
【Linux进程间通信】三、FIFO命名管道
312 0
【Linux进程间通信】三、FIFO命名管道