fork()函数;
pipe函数
int socketpair(int domain , int type , int protocol ,int fd[2]);
dup函数和dup2函数
#include <unistd.h>
int dup(int file_descriptor);
int dup2(int file_descriptor_one , int file_descriptor_two);
不继承原文件的属性,如阻塞和非阻塞
用于重定向文件、管道、网络连接
Readv和writev
writev 多个块整体写,不用使用memcpy组到一起
readv 分块读
struct stat p;
stat("./a" ,&p);
p.st_mode & S_IROTH;
sendfile
sendfile 避免了内核空间和客户空间之间的数据拷贝,直接进行文件操作符之间的操作,效率很高,称为零拷贝。
......
int connfd = accept(sock,(sockaddr*)&clientaddr , &client_len);
.....
sendfile(connfd,filefd , NULL , stat_buf.st_size);
....
专为网络设计,效率变高
mmap函数和munmap
mmap的作用是申请一段进程间可以访问的共享内存,munmap的作用是释放mmap申请的内存;
#include <sys/mman.h>
void *mmap(void *start ,size_t length, int port , int flags, int fd ,off_t offset);
int munmap(void *start ,size_t length);
port可选的参数有:
PORT_READ 可读
PORT_WRITE 可写
PORT_EXEC 可执行
PORT_NONE 不能被访问
flags可选的参数有:
MAP_SHARED 在进程共享这段内存。对这段内存的修改将被映射到文件中。提供共享内存的POSIX方法
MAP_PRIVATE 内存调用为私有。这段内存的修改不会被映射到文件中
MAP_ANONYMOUS 这段内存不是从文件映射而来的,内容被初始化为0,。最后两个参数被忽略
MAP_FIXED 内存段必须位于start参数指定的地址,start的长度必须是内存页片的4096倍;
MAP_HUGETLB 按照大页片分配内存空间
splice
0拷贝操作,效率高;
#include <fcntl.h>
ssize_t splice ( int fd_in ,loff_t * off_in , int fd_out , loff_t off_out , size_t len , usigned int flags);
若 fd_in是管道, off_in = NULL
若fd_in不是管道,off_in = NULL ,从输入数据的当前位置操作
若fd_in不是管道,off_in !=NULL,从off_in位置操作
flags的可选参数有:
SPLICE_F_MOVE
SPLICE_F_NOBLOCK
SPLICE_F_MORE
SPLICE_F_GIFT
回射服务关键代码:
......
int pipefd[2];
ret = pipe(pipefd);
ret = splice(connfd,NULL, pipefd[1],NULL,32768,SPLICE_F_MORE | SPLICE_F_MOVE);
ret = splice(pipefd[0],NULL,connfd,NULL , 32768,SPLICE_F_MORE | SPLICE_F_MOVE);
......
Tee函数
tee函数在两个管道文件描述符之间复制数据,也是零拷贝操作。不消耗数据,tee后还可以继续接下来的处理
#include <fcntl.h>
ssize_t tee(int fd_in ,int fd_out , size_t len ,unsigned int flags);
fcnlt函数
#include < fcnlt.h>
int fcnlt(int fd , int cmd , ...)
cmd的可选值为
复制文件操作描述符:
F_DUPFD
F_DUPFD_CLOSEEXEC
获取和设置文件操作描述符的标志:
F_GETFD
F_SETFD
获取和设置文件操作描述符的状态标志:
F_GETFL O_APPEND O_WRONLY O_RDWR
F_SETFL
管理信号:
F_GETOWN
F_SETOWN
F_GETSIG
F_SETSIG
操作管道容量:
F_SETPIPE
F_GETPIPE
fcnlt的应用,设置非阻塞;
int setnonblocking(int fd)
{
int old_option = fcnlt(fd , f_GETFL);
int new_option = old_option | O_NONBLOCK;
fcnlt(fd , F_SETFL , new_option);
return new_option;
}