0%

sendfile函数

sendfile函数在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,这被称为零拷贝。sendfile函数的定义如下:

1
2
#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

out_fd参数是待写入内容的文件描述符

in_fd参数是待读取内容的文件描述符

offset参数是指从读入文件流的哪个位置开始读,如果为空,则使用读入文件流默认的起始位置

count参数指定在文件描述符in_fdout_fd之间传输的字节数

sendfile成功时返回传输的字节数,失败则返回-1并设置errno

该函数的man手册明确指出,in_fd必须是一个支持类似mmap函数的文件描述符,即它必须指向真实的文件,不能是socket和管道。而out_fd则必须是一个socket。由此可见,sendfile几乎是专门为在网络上传输文件而设计的。

阅读全文 »

readv函数和writev函数

readv函数将数据从文件描述符读到分散的内存块中,即分散读;

writev函数则将多块分散的内存数据一并写人文件描述符中,即集中写。它们的定义如下:

1
2
3
4
#include <sys/uio.h>

ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

fd被操作的目标文件描述符。

ioviovec类型的数组,在recvmsgsendmsg中接触过。

iovcntiov数组的长度。

阅读全文 »

dup和dup2函数

dupdup2用于复制文件描述符,通常用于重定向。

1
2
3
4
#include <unistd.h>

int dup(int oldfd);
int dup2(int oldfd, int newfd);

dup函数创建一个新的文件描述符,该新文件描述符和原有文件描述符oldfd指向相同的文件、管道或者网络连接。并且dup返回的文件描述符总是取系统当前可用的最小整数值。

dup2dup类似,不过它将返回第一个不小于newfd的整数值的文件描述符,并且newfd这个文件描述符也将会指向oldfd指向的文件,原来的newfd指向的文件将会被关闭(除非newfdoldfd相同)。

dupdup2系统调用失败时返回-1并设置errno,成功就返回新的文件描述符。

注意:通过dup和dup2创建的文件描述符并不继承原文件描述符的属性,比如close-on-exec和non-blocking 等

阅读全文 »

Linux服务器规范

学习《Linux高性能服务器编程》第七章Linux服务器规范,为了印象深刻一些,多动手多实践,所以记下这个笔记。这一篇主要记录Linux中日志、用户信息、进程关系、改变工作目录和根目录。

阅读全文 »

高级I/O函数

《Linux高性能服务器编程》在第六章讲解了很多Linux提供了很多高级I/O函数,在这里做个笔记。这一章主要内容包括:pipe函数、dupdup2函数、readv函数和writev函数、sendfile函数、mmap函数和munmap函数、splice函数、tee函数和fcntl函数。

阅读全文 »

socket网络信息查询API

学习《Linux高性能服务器编程》第五章Linux网络编程基础API,为了印象深刻一些,多动手多实践,所以记下这个笔记。这一篇主要记录Linux中socket网络信息查询API,包括gethostbyname和gethostbyaddr、getservbyname和getservbyport、getaddrinfo、getnameinfo。

socket当中两要素:IP和端口号,都是用数值表示的。但是有时候我们可以使用主机名代替IP,使用服务名代替端口号。

1
2
telnet 127.0.0.1 80
telnet localhost www

这个功能就是使用网络信息API实现的。

阅读全文 »

socket选项

读取和设置socket文件描述的方法如下

1
2
3
4
5
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

sockfd参数指定被操纵的目标socket,level参数指定要操作的协议选项,optname参数则指定选项的名字,optvaloptlen参数分别是操作选项的值和长度。截图了一下书中的表格。

阅读全文 »

socket地址信息函数

学习《Linux高性能服务器编程》第五章Linux网络编程基础API,为了印象深刻一些,多动手多实践,所以记下这个笔记。这一篇主要记录Linux中socket地址信息函数。

阅读全文 »

socket数据读写

学习《Linux高性能服务器编程》第五章Linux网络编程基础API,为了印象深刻一些,多动手多实践,所以记下这个笔记。这一篇主要记录Linux中socket数据读写的部分,包括TCP数据读写、UDP数据读写和通用数据读写。

阅读全文 »

socket相关命令

学习《Linux高性能服务器编程》第五章Linux网络编程基础API,为了印象深刻一些,多动手多实践,所以记下这个笔记。这一篇主要记录Linux中socket相关的命令,包括创建socket、命名socket、监听socket、接受连接、发起连接和关闭连接。

阅读全文 »