Linux的文件描述符
在linux下使用文件描述符来表示设备和普通文件。文件描述符是一个整型数据,所有对文件的操作都通过文件描述符实现。
Linux文件描述符的分类和特点
分类:
在linux中有3个已经分配的文件描述符,即标准输入,标准输出和标准错误,它们分别对应的值为0, 1, 2.并且它们分别指向了/proc/self/fd/
目录下的0,1,2
特点:
Linux下的文件描述符的范围为0~OPEN_MAX,因此是一个有限的资源。在使用完成后需要及时释放,通常是是哟i能够close函数。
文件描述符的值仅在同一个进程中有效,即不同进程的文件描述符,同一值很可能描述的不是同一设备或普通文件。
open
函数打开文件
函数原型
int open(const char *filename, int flags);
int open(const char *filename, int flags, mode_t mode);
函数作用
打开指定文件,返回一个整型的文件描述符,出错时返回-1
参数解读
filename为需要打开的文件
flags用于设置文件打开后允许的操作方式
O_RDONLY只读 对应整数值为0
O_WRONLY只写 对应整数值为1
O_RDWR读写 对应整数值为2
O_APPEND追加到文件末尾
O_CREAT文件不存在时则创建,需配合第三个参数一起使用
O_EXCL查看文件是否存在,如果同时指定了O_CREAT,而且文件已经存在则会返回错误,用此flags可以安全地打开一个文件
O_TRUNC将文件长度截断为0,如果文件存在,并且成功打开文件,则会将其长度截断为0
mode参数用于表示打开文件的权限
使用例子
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(void) {
int fd = -1;
char filename[] = "text.txt";
fd = open(filename, O_RDWR);
if (-1 == fd) {
printf("file number%d \n", fd);
return -1;
}
printf("the file number : %d\n", fd);
return 0;
}
read
函数读取文件内容
函数原型
ssize_t read(int fd, void *buff, size_t count);
函数作用
从打开的文件中读取数据,用户可以对读取的数据进行操作。如果读取成功,则会返回读取的字节。当返回-1时,读取函数发生了错误。如果已经读到文件末尾,则返回0.
参数解读
fd一个打开了的文件描述符
buff一个指针,它指向缓冲区地址的开始位置,读入的数据将保存在这个缓冲区中
count表示要读取的字节数量,通常用这个变量来表示缓冲区的大小
使用例子
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(void) {
int fd = -1;
int i;
ssize_t size = -1;
char buf[10];
char filename[] = "text.txt";
fd = open(filename, O_RDWR);
if (-1 == fd) {
printf("file number%d \n", fd);
return -1;
}
printf("the file number : %d\n", fd);
while (size) {
size = read(fd, buf, 10);
if(-1 == size) {
close(fd);
printf("close file");
return -1;
}else {
if (size > 0) {
printf("read %d bytes : ", size);
for (i = 0; i < size; i++) {
printf("%c", *(buf + i));
}
printf("\n");
}else {
printf("reach the end of file\n");
}
}
}
return 0;
}
write
函数写入数据
函数原型
ssize_t write(int fd, const void *buf, size_t count);
函数作用
向打开的文件中写入数据,将用户的数据保存到文件中
参数解读
fd文件描述符
buf写入的内容
count写入数据的大小
使用例子
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(void) {
int fd = -1;
char filename[] = "text.txt";
ssize_t size = -1;
char buf[] = "hello word";
fd = open(filename, O_RDWR);
if (-1 == fd) {
printf("file number%d \n", fd);
return -1;
}
printf("the file number : %d\n", fd);
size = write(fd, buf, sizeof(buf));
printf("write %d bytes to file %s\n", size, filename);
return 0;
}
that's all