管道通信

时间:2023-02-09 18:55:57

UNIX系统在OS的发展上,最重要的贡献之一便是该系统首创了管道(pipe)。这也是UNIX系统的一大特色。 所谓管道,是指能够连接一个写进程和一个读进程的,并允许它们以生产者—消费者方式进行通信的一个共享文件,又称为pipe文件。由写进程从管道的写入端(句柄1)将数据写入管道,而读进程则从管道的读出端(句柄0)读出数据。 管道有两种使用方式:命令行方式和程序方式。

通信(命令行)

输入重定向 ( < )

a.out < a.txt

输出重定向 ( > )

a.out > a.txt

管道符 ( | )

command1 | command2

通信(程序)

文件描述符:

管道通信

一般来说,输入默认是键盘输入,输出和报错默认为显示器输出。

管道的概念:

管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道。

管道只能用于父子进程或者兄弟进程之间(具有“亲缘”关系的进程);

管道单独构成一种独立的文件系统:管道对于管道两端的进程而言就是一个文件,但它不是普通的文件, 它不属于某种文件系统,而是自立门户,并且只存在于内存中。

pipe()(创建管道)

创建一个管道,​​fd[1]​​是管道写入端,​​fd[0]​​是管道读出端。

int pipe(int fd[2])

成功返回 0,失败返回 -1

dup2()

oldfd文件描述符复制到targetfd,使oldfdtargetfd指向同一文件。

int dup2(int oldfd, int targetfd)

open()

打开指定的文件,返回文件描述符。

#include <fcntl.h>
int open(const char * pathname, int flags, mode_t mode);

pathname:欲打开的文件路径字符串

flags

  1. ​O_RDONLY​​ 以只读方式打开文件
  2. ​O_WRONLY​​ 以只写方式打开文件
  3. ​O_RDWR​​ 以可读写方式打开文件
  4. ​O_CREAT​​ 若欲打开的文件不存在则自动建立该文件
  5. ​O_TRUNC​​ 若文件存在并且以可写的方式打开时, 令文件长度清为0,即清除以前的内容

mode:文件权限

close()

关闭指定文件描述符的文件。

int close(int fd);

read()

fd所指示的文件中读出nbyte个字节的数据,并将它们送至由指针buffer所指示的缓冲区中

int read(int fd, char buffer[], int nbyte);

write()

nbyte 个字节的数据,从 buffer 所指向的缓冲区写到由fd所指向的文件中。

int write(int fd, char buffer[], int nbyte);