关于有名管道和无名管道

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

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

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

时间: 2024-10-07 16:53:53

关于有名管道和无名管道的相关文章

进程之间通信之有名管道、无名管道(pipe),笔记

             进程之间的通信作用1.数据传输   :一个进程需要将他的数据传到其他进程2.资源共享3.进程通知事件4.进程控制 :有些进程完全控制另一个进程的执行,如调试状态啊我们需要完全控制他的每一步操作: 通信发展历史Linux进程间的通信IPC由以下几个部分发展而来:1.UNIX进程之间的通信2.基于system v进程间的通信3.POSIX进程之间的通信(portable operating system interface) 现在Linux使用的进程间的通信方式包括:1.管

有名管道和无名管道

管道: 1. 管道是Unix系统最古老的进程间通信方式,其实质是一个虚拟文件,是在内核中维护了一个消息队列. 2. 历史上的管道通常是指半双工管道,只允许数据单向流动.现代系统大都提供全双工管道,数据可以沿着管道双向流动. 有名管道(fifo): 1.  概念:基于有名文件(管道文件)的管道通信 2. 命令形式: # mkfifo fifo  创建管道 # echo hello > fifo   读入hello到管道中 # cat fifo   查看管道中内容 演示: 注意: 1. 执行echo

无名管道与有名管道通讯编程

管道通讯:一个进程在管道的尾部写入数据,另一个进程从管道的头部读出数据.管道包括无名管道和有名管道两种,前者只能用于父进程和子进程间的通信,后者可用于运行于同一系统中的任意两个进程间的通信. 管道通讯的特点: 1. 管道通讯是单向的,有固定的读端和写端. 2. 数据被进程从管道读出后,在管道中该数据就不存在了. 3. 当进程去读取空管道的时候,进程会阻塞. 4. 当进程往满管道写入数据时,进程会阻塞. 5. 管道容量为64KB(#define PIPE_BUFFERS 16,include/li

13.无名管道通讯编程

? 1.进程间的通信: Linux作为典型的多进程操作系统,进程与进程之间肯定需要信息交流,这就需要进程通信. 2.进程通信的目的: ????1.数据传输:一个进程需要将数据发送给另一个进程. ????2.资源共享:多个进程之间共享同样的资源. ????3.通知事件:一个进程需要向另一个/组进程发送信息,通知他们发生了某些事情. ????4.进程控制:有些进程希望完全控制另一个进程的执行,例如Debug进程.此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道他的状态改变. ? 3.通讯

[国嵌攻略][080][无名管道通讯]

通讯目的 1.数据传输 一个进程需要将数据发送给另外一个进程. 2.资源共享 多个进程之间共享同样的资源. 3.通知事件 一个进程需要向另外一个/组进程发送消息,通知它们发生了某事件. 4.进程控制 有些进程希望完全控制另外一个进程的执行,此时控制进程希望能够拦截另外一个进程的所有操作,并能够及时知道它的状态改变. 通信方式 1.无名管道(pipe):数据传输 2.有名管道(fifo):数据传输 3.信号(signal):通知事件 4.消息队列 5.内存共享 6.信号量:资源共享 7.套接字(s

linux应用开发-无名管道编程

linux应用开发-无名管道编程 一 linux进程间通信(ipc) 1 UNIX进程间通信 2 基于System V的通信 3 POSIX通信 二 七种通信方式 1 管道 一个进程在管道的尾部写入数据,另一个进程从管道的头部 读出数据.管道包括无名管道和有名管道两种,前者只能用 于父进程和子进程间的通信,后者可用于运行于同一系统中 的任意两个进程间的通信. 分类: 无名管道(pipo):用于父进程和子进程间的通信 有名管道(FIFO):用于运行于同一系统中的任意两个进程间的通信 特点: 1 管

IPC通信_无名管道(PIPE)

无名管道只能在具有公共祖先的两个进程间使用,且建议半双工使用(因为历史上就是半双工,虽然有些系统支持全双工管道). 无名管道通过pipe函数创建 #include <unistd.h> int pipe(int fd[2]); 其中:参数fd返回两个文件描述符,fd[0]只用来读,是输出,fd[1]只用来写,是输入. 举例: #include <fcntl.h> #include <unistd.h> #include <stdio.h> #include

进程通信 之 管道 标准流管道

2.管道(无名管道): a.只能用于具有亲缘关系的进程之间通信: b.半双工模式,具有固定的读端和写端: c.管道不是普通文件,不属于任何文件系统,只存在于内存中: d.当一个管道通过函数 int pipe(int fd[2]) 创建时,fd[0] 为固定的读端,fd[1] 为固定的写端: e.对管道的读写,其实就是对内核缓冲区的读写: 注意: I. 如果所有指向该管道读端的文件描述符都已经关闭,而写端继续写,则会收到SIGPIPE信号,通常会导致进程异常终止: II. 如果所有指向该管道写端的

进程通信-无名管道

无名管道:主要是针对进程通信的(自己感觉它有很大的局限性) 特点:它不是一个文件系统,不能按名访问,这也是它和有名管道之间最大的区别.无名管道只是一个系统内存里面的东西. 半双工模式,数据只能流向一个方向(老师给我们举得例子就是水厂的水到居民用水,不可能倒着流对吧). 进程之间通信,但是只能是有亲缘关系的进程才能进行通信?比如父子进程:因为在父子进程中,子进程拷贝父进程的数据段,这让这两个进程在通信的时候就有了相连的关系. 下面我们来看一下:无名管道的创建,写入,读取,关闭(我用的的是Liunx