关于有名管道和无名管道

Posted python-zkp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于有名管道和无名管道相关的知识,希望对你有一定的参考价值。

先说一下有名管道和无名管道用的函数:

无名管道使用的是 pipe()

有名管道使用的是fifo()

无名管道主要用于有血缘关系的两个进程间通信,是内核使用环形队列机制实现,借助内核缓冲区实现的。

有名管道主要用于两个不相干的进程间通信,我认为之所以叫有名管道是因为他们借助mkfifo()函数创建的伪文件利用内核缓冲区进行通信,因为创建文件可以指定文件名所以操作和使用文件几乎一样。

 

首先关于无名管道 pipe()函数 需要指定两个文件描述符,通过pipe()函数创建一个管道使其一端读文件一端写

1 int fd[2];
2 pipe(fd);

其中默认 fd[0]读文件,fd[1]写文件。

#include <stdio.h>
 #include <unistd.h>
 #include <string.h>
 #include <stdlib.h>
 
 int main(void)
 
     int fd[2];
     int ret = pipe(fd);
     if (ret == -1)
     
         perror("pipe error!");
         exit(-1);
     
     pid_t pid = fork();
     if (pid == -1)
     
         perror("fork error!");
         exit(-1);
     
     else if (pid == 0)//子进程读数据
     
         close(fd[1]);
         char buf[1024];
         ret = read(fd[0], buf, sizeof(buf));
         if (ret == 0) printf("------\n");
         write(STDOUT_FILENO, buf, ret);
     
     else
     
         close(fd[0]);// 父进程写数据
         char* str = "Hello pipe\n";
        write(fd[1], str, strlen(str));
         sleep(2);
     
 
    

而fifo()函数是一个进程写数据,一个进程读数据,两个进程不能结束

一端读数据

#include <fcntl.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <stdlib.h>
 
 int main(void)
 
     int fd = open("abc", O_RDONLY);
     char buf[1024];
     while (1)
     
         sleep(1);
         int ret = read(fd, buf, sizeof(buf));
         if (ret == -1)
         
             perror("read error");
             exit(-1);
         
         if (ret != 0) //如果ret == 0 那么内存缓冲区就是空的
             printf("%s\n", buf);
     
     close(fd);
     return 0;
 

一个进程写数据

#include <stdio.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <stdlib.h>
 
 int main(void)
 
     int ret = access("abc", F_OK);
     int fd;
     if (ret != 0)
     
         ret =  mkfifo("abc", 0777);
         if (ret == -1) //如果返回值是-1说明文件不存在 我们就创建一个文件
         
             perror("mkfifo");
             exit(-1);
         
     
     fd = open("abc", O_WRONLY);
     while(1)
     
         sleep(1);
         char *str = "myname";
         write(fd, str, sizeof(str));
     
     close(fd);
     return 0;
 

 

以上是关于关于有名管道和无名管道的主要内容,如果未能解决你的问题,请参考以下文章

进程间通信的方式

Linux进程间的通信方式

2014025681 《嵌入式系统程序设计》第七周学习总结

linux 管道实现解析

有名管道fifo

201402579 《嵌入式系统程序设计》第七周学习总结