Linux内核文件IO | 来去匆匆 恨不能相逢
Cobb 506 1

引用前辈的文章,一些解释,可供参考! 文件描述符、 同步I/O:fsync()、fdatasync()、sync()、O_SYNC标志位、O_DSYNC和O_RSYNC 直接I/O 、 缓冲I/O、 Flush(刷新输出)流

文件的读写


int main()
{
    // open成功返回一个文件描述符;错误返回-1     
    // 参数含义: 文件路径 状态  权限(一般情况下: 目录 0644 、 文件 0755)
    int fd = open("data.txt", O_RDWR|O_CREAT, 0755);
    if (fd < 0)
    {
        // open API调用失败,会写linux全局的错误码编程errno,
        // perror函数可以打印出errno错误码对应的详细描述信息
        perror("open err");
        exit(-1);
    }

    // 写文件
    char buf[1024] = "hello world";
    if (write(fd, buf, strlen(buf)) < 0)
    {
        perror("write err");
        exit(-1);
    }

    // 重置文件位置指针到开头
    if (lseek(fd, 0, SEEK_SET) < 0)
    {
        perror("lseek err");
        exit(-1);
    }

    // 读文件
    bzero(buf, 1024);
    if (read(fd, buf, 1024-1) < 0)
    {
        perror("read err");
        exit(-1);
    }

    printf("buf:%s\n", buf);

    // 使用完一定要close关掉文件描述符
    close(fd);
}

0/1/2使用

知识储备 read和write第一个参数如果是数字表示: ** 0:标准输入 STDIN ** 1:标准输出 STDOUT ** 2:标准错误 STDERR

int main()
{
    char buf[1024] = {0};
    for (;;)
    {
        int size = read(0, buf, 1024);
        if (size < 0)
        {
            perror("read err");
            exit(-1);
        }
        // buf: exit\r\n
        if (strncmp(buf, "exit", 4) == 0)
            break;

        write(1, buf, strlen(buf));
        bzero(buf, 1024);
    }
}

阻塞和非阻塞的fd

int main()
{
    // 先设置fd:0工作在非阻塞模式下
    // F_GETFL   获取了文件描述符0的所有状态标志
    int flag = fcntl(0, F_GETFL);
    // 给flag添加非阻塞标志
    flag |= O_NONBLOCK;
    // 设置fd:0的新flag状态标志
    fcntl(0, F_SETFL, flag);

    char buf[1024] = {0};
    for (;;)
    {
        /*
        工作在非阻塞模式下:
        1.read读取成功,返回读取的字节数
        2.read操作失败,返回-1
        3.read非阻塞返回,返回-1
        */
        int size = read(0, buf, 1024);
        if (size < 0)
        {
            if (errno == EAGAIN)
            {
                // 正常的非阻塞返回
                printf("try again\n");
                sleep(2);
            }
            else
            {
                perror("read err");
                exit(-1);
            }
        }
        // buf: exit\r\n
        if (strncmp(buf, "exit", 4) == 0)
            break;

        write(1, buf, strlen(buf));
        bzero(buf, 1024);
    }
}
评论区

索引目录