标准输入(描述符0):STDIN_FILENO
标准输出(描述符1):STDOUT_FILENO
标准错误(描述符2):STDERR_FILENO
O_RDONLY:只读
O_WRONLY:只写
O_RDWR:可读可写
umask:umask需要在打开文件前使用函数umask(umask);进行设置
fd:源文件的描述符
n:拷贝最多n个字节
buf:目标存储器位置
ssize_t write(int fd,const void *buf, size_t n);
buf:源存储器位置
n:拷贝最多n个字节
fd:目标文件的描述符
不足值出现情况:
读时遇到EOF
从终端读文本行
读和写网络套接字
RIO包会自动处理不足值。RIO提供了两类不同的函数:
无缓冲的输入输出函数。这些函数直接在存储器和文件之间传送数据,没有应用级缓冲,他们对将二进制数据读写到网络和从网络读写二进制数据尤其有用。
带缓冲的输入函数。这些函数允许你高效地从文件中读取文本行和二进制数据,这些文件的内容缓存在应用级缓冲区内,类似于像printf这样的标准I/O函数提供的缓冲区。是线程安全的,它在同一个描述符上可以被交错地调用。例如,可以从一个描述符中读一些文本行,然后读取一些二进制数据,接着再多读取一些文本行。
#include “csapp.h”
ssize_t rio_readn(int fd, void usrbuf, size_t n);
ssize_t rio_writen(int fd, void usrbuf, size_t n);
返回:
成功:传送的字节数
EOF:0
出错:-1
文本行:一个由换行符(0x0a)结尾的ASCII码字符序列
每打开一个描述符都会调用一次rio_readinitb函数,将描述符fd和地址rp处的一个类型为rio_t的读缓冲区联系起来
void rio_readinitb(rio_t *rp, int fd);
rio_readlineb函数从文件rp读一个文本行(包括换行符),到存储器位置usrbuf,用空字符结束文本行。至多读maxlen-1个字节,余下一个字符留给结尾空字符。超过maxlen-1部分会被截断。
ssize_t rio_readlineb(rio_t rp,void usrbuf, size_t maxlen);
rio_readnb从文件rp最多读n个字节到存储器位置usrbuf。
ssize_t rio_readnb(rio_t rp,void usrbuf, size_t n);
返回:
成功:读的字节数
EOF:0
出错:-1
对同一描述符,带缓冲区的函数调用可以任意交叉进行,但他们和无缓冲的调用不应交叉使用。
#include
#include <sys/stat.h>
int stat(const filename, struct stat buf);
int fstat(int fd, struct *buf);
返回:成功为0;出错为-1
stat以文件名为输入,fstat以文件描述符为输入。