无名管道和有名管道

本文详细介绍了无名管道和有名管道在Linux系统中的使用。无名管道适用于有亲缘关系的进程间通信,具有不可见、半双工、固定读写端的特点。有名管道则可通过文件系统进行通信,适用于任意进程。文中通过实例展示了管道的创建、读写特性和大小限制,以及管道破裂的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、无名管道

无名管道用于有亲缘关系的进程间的通信,管道字如其名,它就像在两个进程之间铺设了一条管道,进程通过管道进行数据交互。无名管道是没有名字的,它由pipe或者pipe2函数创建,与之对应的是有名管道。

1、特点:

​ (1)创建之后再文件系统中不可见

​ (2)以半双工的方式进行通信
半双工(Half Duplex)数据传输指数据可以在一个信号载体的两 个方向上传输,但是不能同时传输。

​ (3)拥有固定的读端(0)和写端(1)

​ (4)只能用于具有亲缘关系的进程间通信

2、无名管道的创建–pipe

#include <unistd.h>//头文件

int pipe(int pipefd[2]);
参数:
    pipefd:存放无名管道读端和写端的数组地址
    
    pipefd[0]--读端
    pipefd[1]--写端
    
返回值:
    成功返回0,失败返回-1;

3、无名管道的读写性

​ (1)读–特性:

​ <1>写端存在:

​ 管道有数据:返回读到的字节数

​ 管道无数据:阻塞

​ <2>写端不存在:

​ 管道有数据:返回读到的字节数

​ 管道无数据:返回0

​ (2)写–特性:

​ <1>读端存在:

​ 管道有空间:返回写入的字节数

​ 管道无空间:阻塞,直到有空间为止

​ <2>读端不存在:

​ 无论管道是否有空间,管道破裂
(3)无名管道的大小
我们可以通过一个while循环让它不断写入,当满了时它就会停止写入,这时也就是它的大小。
实例:

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

int main(int argc, char *argv[])
{
    
    int pfd[2]={
   0};//定义无名管道数组,只有两个端口,所以大小为2
    int ret=pipe(pfd);//pipe--创建无名管道
    
    char buf[1]={
   0};//缓冲区大小,每次写入一个
    int size,count=0;
        while(1)
        {
   
            size=write(pfd[1],buf,1);
            if(size<0)//write写入不成功就退出,并输出错误原因
            {
   
            	perror("write");
            	exit(-1);
            }
            count=count+size;//循环直到写满
            printf("size=%d\n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值