linux高性能服务器编程第六章(高级I/O函数)

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;
}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值