Linux编程之pipe与fifo

本文详细介绍了Linux编程中的管道(pipe)和命名管道(fifo)的使用,包括创建、读写操作及阻塞模式。同时,讲解了popen函数如何在进程间建立管道,实现命令执行的输出重定向。通过实例代码演示了各种用法。
摘要由CSDN通过智能技术生成

pipe的使用

管道(pipe)是POSIX标准中一种可用于进程间通信的单向数据通道。一个管道有一个写端和一个读端,数据从写端写入,从读端读取,因此读端和写端分别有一个文件描述符。

管道的读写模式可以是阻塞模式,也可以是非阻塞模式(O_NONBLOCK)。对于阻塞模式,如果管道中没有数据,那么读操作将阻塞,直到写入足够数据;如果管道已满,那么写操作将阻塞,直到读出数据留出足够空间。

管道有一个最大容量,可用pathconf(_PC_PIPE_BUF)获取。当写入的数据小于最大容量时,写入操作是原子的,内核会把数据全部写入管道;而当写入的数据大于最大容量时,则写操作不再是原子的,多个进程写的数据可能交织在一起。

用于创建管道的函数如下。

       #include <unistd.h>

       int pipe(int pipefd[2]);

该函数所带的参数实际上是输出参数。如果该函数成功,则返回两个文件描述符,pipefd[0]代表管道读端的文件描述符,pipefd[1]则代表管道写端的文件描述符。如果要修改管道的阻塞模式,可以用fcntl函数来实现。Linux还提供一个特有的函数pipe2,允许在创建管道时直接指定阻塞模式。该函数如下:

       #define _GNU_SOURCE             /* See feature_test_macros(7) */
       #include <fcntl.h>              /* Obtain O_* constant definitions */
       #include <unistd.h>

       int pipe2(int pipefd[2], int flags);

pipe函数创建的管道是匿名管道,因此只能在共享文件描述符的父子进程之间使用。Linux的man手册给出了一个例子:

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

       int
       main(int argc, char *argv[])
       {
           int pipefd[2];
           pid_t cpid;
           char buf;

           if (argc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值