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

results matching ""

    No results matching ""