linux 文件描述符
FD (file descriptor): 文件描述符,但成功打开一个文件时操作系统会返回一个标识,该描述符是该打开文件的唯一标识。 不同的文件标识符可能代表一个相同文件,一个文件可同时被多个进程打开,同时返回不同的文件标识符,文件标识符类似于一个指针,对文件进行的I/O操作可通过该文件的文件标识符进行操作。
文件标识符0 是指标准输入 STDIN
文件标识符1 是指标准输入 STDOUT
文件标识符2 是指标准错误 STDERR
open函数
头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
函数原型
一般用来打开某个文件
open(const char *pathname, int flags(mode_t mode));
pathname:代表当前路径下的文件名,或文件的绝对路径
flags 代表选中打开状态的异或值
O_RDONLY:只读模式
O_WRONLY:只写模式
O_RDWR:可读可写
上三个状态必须选择且至多选择一个
O_APPEND 表示追加,如果原来文件里面有内容,则这次写入会写在文件的最末尾。
O_CREAT 表示如果指定文件不存在,则创建这个文件
O_EXCL 表示如果要创建的文件已存在,则出错,同时返回 -1,并且修改 errno 的值。
O_TRUNC 表示截断,如果文件存在,并且以只写、读写方式打开,则将其长度截断为0。
O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)
返回值
若成功打开文件, 返回一个文件描述符,否则返回-1。
write 函数
头文件
#include <unistd.h>
函数原型
write(int fd, const void *buf, size_t count);
fd:写文件的文件描述符
buf:存放写入数据的首地址
count:写入数据的字节数
返回值
大于等于0 :成功写入的字节数
小于0:写入失败
read函数
头文件
#include <unistd.h>
函数原型
read(int fd, void *buf, size_t count);
类似于write
返回值
大于等于0 :成功读入的字节数
小于0:写入失败
基于上三个函数完成的copy函数实例
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
char *buf[64]; //字符缓存区
void copy(int fd_r, int fd_w){
int n;
while((n = read(fd_r, buf, sizeof(buf))) > 0){
if(write(fd_w, buf, n) != n){
printf("WRITE ERROR\n");
exit(1);
}
}
if(n<0){
printf("READ ERROR\n");
exit(1);
}
}
int main(int argc,char* argv[]){
int fd_w,fd_r;
if(argc < 3){
printf("error\n");
exit(1);
}
if((fd_r = open(argv[1], O_RDONLY)) < 0){
printf("OPEN READ FILE ERROR\n");
exit(1);
}
if((fd_r = open(argv[2], O_WRONLY)) < 0){
printf("OPEN WRITE FILE ERROR\n");
exit(1);
}
copy(fd_r, fd_w);
close(fd_r),close(fd_w);
exit(0);
}