- int open(const char *pathname, int flags,…);
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
功能:打开一个文件 有可能创建一个文件
参数:pathname 指定了要打开的文件的路径
flags三选一:O_RDONLY 只读,O_WRONLY 只写 ,O_RDWR 可读可写
文件的创建标记 文件的身份标记 0或多个可以按位或到flags中,详细见man手册
O_CREAT 如果文件不存在,将创建文件.
O_EXCL 如果和O_CREAT一起指定,文件存在的情况下,报错
O_TRUNC 文件存在的情况下,将文件的内容清空为0.
O_APPEND 以追加模式打开文件,每次写之前,读写位置被定位在文件的末尾.
… 可变参数 这个参数有没有取决于flags 如果flags中出现O_CREAT.这个参数必须提供.这个参数
mode,指定了新建文件的权限指定的权限会被进程的umask修改.方法如下:mode & ~umask
返回值:成功 返回新的文件描述符 失败 -1 errno被设置
补充: 1 … 可变参数 可变参数的个数和类型取决于可变参数前边的那个参数.
int printf(const char*format, …);
printf(“hello beijing\n”);
printf(“name=%s\n”,name);
printf(“name=%s\tage=%d\n”,name,age);
2 文件描述符 程序运行的时候,需要访问计算机的资源,需要对这些资源的访问做记录. 记录在进程PCB(process control block)。文件是计算机的一种资源 进程对文件的访问就要做记录.
标准输入 0 STDIN_FILENO
标准输出 1 STDOUT_FILENO
标准错误输出 2 STDERR_FILENO
-
int close(int fd);
#include <unistd.h>
功能:关闭一个文件描述符
参数:fd 指定要关闭的文件描述符
返回值:成功 0 错误 -1 errno被设置 -
read(2)/write(2)
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
功能:从文件描述符读取数据到buf
参数:
fd 指定具体的文件描述符 也就是从这个文件描述符读取数据
buf 将读取的数据放到buf指定的空间里
count 请求系统读取的最大字节数
返回值:错误 -1 errno被设置 成功 返回实际读取到的字节数 0代表到达文件的末尾
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
功能:将buf中的数据写入fd指定的文件中
参数:
fd 指定具体的文件描述符
buf 写入文件的数据存储buf指定的地址空间里
count 请求写入文件的字节数
返回值:错误 -1 errno被设置 成功 实际写入的字节数被返回 0代表什么都没写 -
off_t lseek(int fd, off_t offset, int whence);
#include <sys/types.h>
#include <unistd.h>
功能:重新定位文件的读写位置
参数:
fd 指定了文件的描述符 就是要操作这个文件的读写位置
offset 相对参照物的偏移量
whence
SEEK_SET 将文件的读写位置定位在offset指定的字节处 文件的起始位置+offset
SEEK_CUR 将文件的读写位置定位在当前位置+offset字节处
SEEK_END 将文件的读写位置定位在文件的大小+offset字节处
返回值:
错误 (off_t) -1 errno被设置
成功 定位的位置距离文件开头的字节数 -
dup(2) dup2(2) 实现文件描述符的复制
#include <unistd.h>
int dup(int oldfd);
功能: 复制一个文件描述符
参数:
oldfd 源描述符
返回值:
错误 -1 errno被设置
成功 返回新的文件描述符 新文件描述符是最小的 未使用的那个文件描述符
int dup2(int oldfd, int newfd);
功能:复制一个文件描述符
参数:
oldfd 指定源描述符
newfd 指定目标描述符 如果目标描述符是打开的,先关闭,再使用
返回值:
错误 -1 errno被设置
成功 返回新的文件描述符
使用小结:
用完关闭,即调用close(2)。