总结
豆包 AI 助手文章总结
首页 > 运维 > linux运维 > 正文

【Linux】Linux文件

蓮花仙者
发布: 2025-04-19 20:15:57
原创
910人浏览过

linux文件系统和操作方法

Linux文件系统的结构如下:

【Linux】Linux文件

  • root: 这是系统管理员(也称为超级管理员)的用户主目录。
  • bin: 这是Binary的缩写,存放最常用的命令。
  • boot: 这里存放启动Linux时使用的核心文件,包括一些连接文件和镜像文件。
  • dev: 这是Device(设备)的缩写,存放Linux的外部设备。Linux中访问设备的方式与访问文件的方式相同。
  • etc: 存放所有配置文件和系统管理所需的配置文件和子目录。
  • home: 用户的主目录,每个用户在Linux系统中都有一个以用户账号命名的目录。
  • var: 存放不断变化的文件数据,通常将经常被修改的目录放在这里,包括各种日志文件。
  • lib: 存放系统最基本的动态链接共享库,类似于Windows中的DLL文件,几乎所有应用程序都会用到这些共享库。
  • usr: 存放系统用户工具和程序,包括:
    • bin: 用户命令
    • sbin: 超级用户使用的管理程序和系统守护程序
    • include: 标准头文件
    • lib: 库文件
    • src: 内核源代码
  • tmp: 用于存放临时文件。
  • media: Linux系统会自动识别一些设备,如U盘、光驱等,并将这些设备挂载到这个目录下。
  • mnt: 用于临时挂载其他文件系统。
  • proc: 包含进程的相关信息。

Linux文件操作方式主要通过文件描述符(fd)进行底层文件操作(系统调用)以及使用I/O库函数。


Linux底层文件操作(关于文件的系统调用)


write函数的使用:

成功:返回实际写入的字节数
失败:返回-1,并设置错误号errno,可使用strerror(errno)查看错误信息
注意:从文件当前指针位置开始写入,文件刚打开时指针指向文件头。

示例:

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main(void) {
    char buff[] = "hello world\n";
    //1 2 都是输出到控制台
    int len = 0;
    len = write(1, buff, sizeof(buff)); //标准输出
    if (len != -1) {
        printf("写入成功,写入的字节数为:%d\n", len);
    } else {
        printf("写入失败,错误信息为:%s\n", strerror(errno));
    }
    return 0;
}
登录后复制

【Linux】Linux文件


read函数的使用:

返回值大于0——实际读取的字节数
返回值为0——已读到文件尾
返回值为-1——出错
注意:参数3表示最多能接受的字节数,而不是指一定要输入的字节数。

示例:

char buffer[1024];
int cnt = read(0, buffer, sizeof(buffer)); //从标准输入读
if (cnt > 0) {
    buffer[cnt] = '\0'; //确保字符串以空字符结尾
    printf("读取成功,读取的字节数为:%d,内容为:%s\n", cnt, buffer);
} else if (cnt == 0) {
    printf("已读到文件尾\n");
} else {
    printf("读取失败,错误信息为:%s\n", strerror(errno));
}
登录后复制

open函数的使用:

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
登录后复制

成功:返回文件描述符
失败:返回-1
打开方式:

  • O_RDONLY:只读
  • O_WRONLY:只写
  • O_RDWR:读写
  • O_CREAT:如果文件不存在,则创建该文件,并使用第三个参数设置权限;如果文件存在,则只打开文件。
  • O_EXCL:如果同时使用O_CREAT且文件已存在,则返回错误,用于防止多个进程同时创建同一个文件。
  • O_APPEND:尾部追加方式(打开后,文件指针指向文件的末尾)。
  • O_TRUNC:若文件存在,则长度被截为0,属性不变。

第三个参数:设置权限(略)

注意:返回的文件描述符是该进程未打开的最小的文件描述符。

示例:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#define FILE_RW_LEN 1024
int main(void) {
    //第二个参数-文件存在则无法打开
    //O_APPEND —— 追加
    int fd = open("./test_open.txt", O_CREAT | O_EXCL | O_RDWR, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH);
    int count = 0;
    char buffer[FILE_RW_LEN] = "hello i am test";
    if (fd != -1) {
        count = write(fd, buffer, strlen(buffer));
        if (count != -1) {
            printf("写入成功,写入的字节数为:%d\n", count);
        } else {
            printf("写入失败,错误信息为:%s\n", strerror(errno));
        }
        close(fd);
    } else {
        printf("打开文件失败,错误信息为:%s\n", strerror(errno));
    }
    return 0;
}
登录后复制

【Linux】Linux文件


close函数的使用:

int close(int fd);
登录后复制

成功:返回0
失败:返回-1

示例:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#define FILE1_NAME "file1.txt"
#define FILE2_NAME "file2.txt"
int main(void) {
    int file1, file2;
    char buffer[4096];
    int len = 0;
    file1 = open(FILE1_NAME, O_RDONLY);
    if (file1 != -1) {
        file2 = open(FILE2_NAME, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
        if (file2 != -1) {
            while ((len = read(file1, buffer, sizeof(buffer))) > 0) {
                write(file2, buffer, len);
            }
            close(file2); //实战记得判断是否关闭成功
        } else {
            printf("无法打开文件%s,错误信息为:%s\n", FILE2_NAME, strerror(errno));
        }
        close(file1);
    } else {
        printf("无法打开文件%s,错误信息为:%s\n", FILE1_NAME, strerror(errno));
    }
    return 0;
}
登录后复制

观察耗时:
time xxx 程序总的执行时间
程序本身所消耗的时间
系统调用所消耗的时间

【Linux】Linux文件


lseek函数的使用:

off_t lseek(int fd, off_t offset, int whence);
登录后复制

成功:返回新的文件位置与文件头之间的偏移
失败:返回-1

示例:从一个文件偏移100处,拷贝100字节到另一个文件。

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#define FILE1_NAME "lseek_test.c"
#define FILE2_NAME "lseek_test2.txt"
#define SIZE 100
int main(void) {
    int file1, file2;
    char buffer[1024];
    int ret;
    file1 = open(FILE1_NAME, O_RDONLY);
    if (file1 != -1) {
        file2 = open(FILE2_NAME, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
        if (file2 != -1) {
            lseek(file1, 100, SEEK_SET); // 移动文件指针到偏移100处
            ret = read(file1, buffer, SIZE); // 读取100字节
            if (ret > 0) {
                buffer[ret] = '\0';
                write(file2, buffer, SIZE);
            }
            close(file1);
            close(file2);
        } else {
            printf("无法打开文件%s,错误信息为:%s\n", FILE2_NAME, strerror(errno));
        }
    } else {
        printf("无法打开文件%s,错误信息为:%s\n", FILE1_NAME, strerror(errno));
    }
    return 0;
}
登录后复制

ioctl函数的使用(嵌入式相关):

int ioctl(int fd, int cmd, [int *argdx, int argcx]);
登录后复制

fd是用户程序打开设备时使用open函数返回的文件标识符,cmd是用户程序对设备的控制命令,后面是一些补充参数,一般最多一个,这个参数的有无和cmd的意义相关。

以上就是【Linux】Linux文件的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
豆包 AI 助手文章总结
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号