文章目录
  1. pipe函数
  2. dup函数与dup2函数

pipe函数

pipe函数创建一个管道,以实现进程间通信。

1
2
3
4
5
6
/*
引用方式: #include <unistd.h>
fd: 存放管道两端的文件描述符; fd[0]只能从管道读数据, fd[1]只能向管道写数据
返回0: 成功 || 返回-1并设置errno: 失败
*/
int pipe(int fd[2]);

因此,若要实现进程间双向数据传输,则要使用两个管道。默认情况下,这两个文件描述符都是阻塞的;即若使用read系统调用来读一个空的管道,则read会被阻塞;同理,使用write系统调用来写一个满的管道也会陷入阻塞。

fd[1]的引用计数归0,则使用read读该管道将返回0;fd[0]的引用计数归0,则使用write写该管道将失败,并触发SIGPIPE信号。

管道容量大小默认为65536字节,可使用fcntl函数修改管道容量。

此外,socket基础API提供socketpair函数创建双向管道。

1
2
3
4
5
6
7
8
9
/*
引用方式: #include <sys/socket.h>
domain: 指定底层协议族; 此时只能是AF_UNIX
type: 指定服务类型; SOCK_STREAM: 流服务 || SOCK_UGRAM: 数据报服务;
protocol: 在前面两个参数的基础上更具体的选择一个协议, 一般设置为0, 表示使用默认协议
fd: 存放管道两端的文件描述符
返回0: 成功 || 返回-1并设置errno: 失败
*/
int socketpair(int domain, int type, int protocol, int fd[2]);

dup函数与dup2函数

dup*函数可复制文件描述符。从而实现输入/输出的重定向。

1
2
3
4
5
6
7
8
/*
引用方式: #include <unistd.h>
bottom: 返回的第一个不小于bottom文件描述符
返回新创建的文件描述符, 它与fd指向同一文件/管道/网络连接(dup返回的文件描述符总是取当前可用的最小整数值)
*/
int dup(int fd);

int dup2(int fd, int bottom);

简要说明代码6-1输出重定向的原理。关闭标准输出文件描述符STDOUT_FILENO(值为1),然后复制socket文件描述符connfd。由于dup总是返回操作系统中最小的可用文件描述符,因此dup函数返回1。因此,printf实际上会打印到socket文件描述符connfd中。

以上就是CGI服务器的基本工作原理