无名管道在进程中使用的方法示例

本文通过C语言代码示例,详细解释了管道的单向通信机制,以及在阻塞I/O情况下,当写端和读端关闭或未操作时的行为,包括数据读完后的处理、读写端异常情况和管道满时的阻塞。

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

管道一般是单向的。一个进程往里面写,另一个进程从里面读。下面是一个代码示例

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
    pid_t pid;
    int fd[2];
    int n;
    char buf[20]; //char* 也可以

    if(pipe(fd) < 0)
    {
        perror("pipe error");
        exit(1);
    }
    pid = fork();
    if(pid < 0)
    {
        perror("fork error");
        exit(1);
    }
    else if(pid > 0) //父进程
    {
        close(fd[0]); //关闭读功能
        write(fd[1], "hello pipe\n", 19);
        wait(NULL); //等待任意一个子进程终止
    }
    else // 0, 子进程
    {
        close(fd[1]);
        sleep(1);
        n = read(fd[0], buf, 20);
        write(1, buf, n);//第一个入参为1,表示标准输出
    }

    return 0;
}

程序输出是:

zhanghaodeMacBook-Pro:cpp_excise zhanghao$ g++ 无名管道.cpp 
zhanghaodeMacBook-Pro:cpp_excise zhanghao$ ./a.out 
hello pipe

假设管道都是阻塞I/O操作,没有设置O_NONBLOCK标志。则:

  1. 如果所有写端的文件描述符都关闭了,单仍然在读,则剩余数据被读完了后,再次read会返回0。就像读到文件末尾一样。
  2. 如果写端没关闭,但也没写数据进去,那读端在读完管道所有字符后,会阻塞,直到管道有数据了才会继续下去。
  3. 如果所有读端都关闭了,写端再往里write,那么该进程会收到信号:SIGPIPE,可能会导致进程异常终止。
  4. 如果读端没关闭,但是也没读,那写端一直写会导致管道写满,就会阻塞,直到管道有空位置了才能继续写。(可能是64k,即65535)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码到程攻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值