码迷,mamicode.com
首页 > 其他好文 > 详细

关于有名管道和无名管道

时间:2019-09-05 21:42:11      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:div   ==   读数   %s   types   sizeof   print   main   通过   

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

无名管道使用的是 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;
 }

 

关于有名管道和无名管道

标签:div   ==   读数   %s   types   sizeof   print   main   通过   

原文地址:https://www.cnblogs.com/python-zkp/p/11469935.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!