Linux进程间通信:无名管道

无名管道通信是指在进程间创建一个管道文件,一端读, 一端写, 实现通信。这个管道文件并不在磁盘上, 而是在内存中, 进程结束后随即释放。
无名管道是半双工通信, 在同一时刻, 一端只能读, 另一端只能写。
无名管道只能在亲缘进程之间实现通信, 它依赖亲缘进程间相同的内存空间中的文件描述符。
管道通信方式类似队列数据结构, 先进先出

注意点:

  1. 读端关闭, 写端写入时, 触发管道破裂信号(SIGPIPE
  2. 写端关闭, 读端读取时, 读取数据完毕后立即返回, 不再阻塞
  3. 写端不写入, 读端读取时, 读完管道内的数据后, 读端阻塞
  4. 写端写入, 读端不读取时, 管道写满后, 写端阻塞
  5. 无名管道有固定的两端, pipefds[0] 固定为读端, pipefds[1]固定为写端
  6. 不能使用lseek在无名管道中偏移

代码示例

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

#define BUF_SIZE 100

int main(int argc, const char *argv[])
{
    // 创建无名管道文件描述符
    // pipefds[0] 只读
    // pipefds[1] 只写
    int pipefds[2];
    if (-1 == pipe(pipefds))
    {
        perror("pipe error");
        return EXIT_FAILURE;
    }

    // 创建子进程
    pid_t pid = fork();
    if (-1 == pid)
    {
        perror("fork");
        return EXIT_FAILURE;
    }

    // 子进程执行区
    if (pid > 0)
    {
        // 子进程只读管道, 关闭写端文件描述符
        close(pipefds[1]);
        char buf[BUF_SIZE];

        bzero(buf, sizeof(buf));
        read(pipefds[0], buf, sizeof(buf) - 1);
        printf("[thread son][read from pipe]: %s\n", buf);

        close(pipefds[0]);

		return EXIT_SUCCESS;
    }

	// 父进程执行区
    // 父进程只写管道, 关闭读端文件描述符
    close(pipefds[0]);
    char buf[BUF_SIZE];
    sprintf(buf, "hello, this is father speaking.");

    write(pipefds[1], buf, sizeof(buf) - 1);
    close(pipefds[1]);

    return EXIT_SUCCESS;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

__万波__

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

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

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

打赏作者

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

抵扣说明:

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

余额充值