Linux管道(无名管道)

Linux:

是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。它主要用于基于Intel x86系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。

一、管道

管道,分为无名管道和有名管道,是 UNIX 系统IPC最古老的形式,是进程间通讯的一种

1、无名管道特点:
它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。

它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。

它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

创建无名管道函数和所需头文件

#include <unistd.h>
int pipe(int fd[2]);

其函数返回值失败为-1,成功为0
当无名管道建立成功时会创建两个文件描述符f[0] 、 f[1],并且创建成功的管道相当于一个队列,先进先出,有读端和写端
f【0】代表读端
f【1】代表写端

在这里插入图片描述

在通讯过程中写端会传入数据读端会读出数据
读阻塞:如果在管道中没有数据而运行read时,便会读阻塞
写阻塞:如果写的内容的大小大于管道大小,便会写阻塞
我们先来看一下在一个进程里的实现
在该进程中我们先写入数据在读数据,无名管道在读数据之后管道内入队的数据就会被出队(因为管道相当于一个队列)

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
    int fd[2];
    int r = pipe(fd);
    
    if(r == -1)
    {
        printf("creat pipe fail\n");
        return r;
    }
    else
    {
        printf("creat pipe success\n");
    }

    char write_buff[] = "hello world!";
    char read_buff[128] = {0};
    
    write(fd[1],write_buff,sizeof(write_buff));

    read(fd[0],read_buff,127);
    
    printf("%s\n",read_buff);

    close(fd[0]);
    close(fd[1]);
    
    return 0;
}

无名管道实现的进程间通讯只能父子进程间通讯
在这里插入图片描述

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

int main()
{
    int fd[2];
    int r = pipe(fd);
    if(r == -1)
    {
        printf("creat pipe fail\n");
        return r;
    }
    else
    {
        printf("creat pipe success\n");
    }
    
    pid_t pid = fork();
    assert(pid!=-1);
    if(pid == -1)
    {
        printf("creat fork fail\n");
        return pid;
    }

    if(pid == 0)
    {
        char w_buff[] = "hello world!";
        write(fd[1],w_buff,sizeof(w_buff));
        close(fd[1]);
    }
    else
    {
        char r_buff[128] = {0};
        read(fd[0],r_buff,127);
        printf("r_buff = %s\n",r_buff);
        close(fd[0]);
    }

    return 0;
}
发布了28 篇原创文章 · 获赞 0 · 访问量 1000

猜你喜欢

转载自blog.csdn.net/wfea_lff/article/details/103990050