服务器大本营

 找回密码
 我要入营

微信扫码 , 快速开始

QQ登录

只需一步,快速开始

查看: 744|回复: 0

【Linux】Linux文件结构及操作方式

[复制链接]

3万

敬重

668

主题

207

精华

管理员

积分
7729

启航之章进阶之印里程之碑突破之证飞跃之星蜕变之勋卓越之路龙年行大运

QQ
发表于 2024-7-8 15:50:02 | 显示全部楼层 |阅读模式

我要入营,结交更多好友,开启更多功能,轻松玩转服务器大本营!

您需要 登录 才可以下载或查看,没有账号?我要入营

x
Linux文件操作
Linux中,一切皆文件(网络设备除外)。
硬件设备也是文件,通过文件来使用设备。
目录(文件夹)也是一种文件。

Linux文件的结构

【Linux】Linux文件结构及操作方式

【Linux】Linux文件结构及操作方式


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

Linux文件的操作方式
· 文件描述符fd
fd是一个大于等于0的整数。
每打开一个文件,就创建一个文件描述符,通过文件描述符来操作文件。

预定义的文件描述符:
0: 标准输入,对应于已打开的标准输入设备(键盘)
1: 标准输出,对应于已打开的标准输出设备(控制台)
2: 标准错误,对应于已打开的标准错误输出设备(控制台)
(运行程序在proc文件夹中的对应进程文件夹下查看fd文件夹)
多次打开同一个文件,可以得到多个不同的文件描述符。

· 使用底层文件操作(系统调用)
例如:read

· 使用I/O库函数
例如: fread

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

write
往一个文件描述符中写数据。

返回值:
· 成功:返回实际写入的字节数
· 失败:返回-1,设置错误号errno,用strerror(errno)查看
注意:

· 从文件当前指针位置开始写入。文件刚打开时从文件指针指向文件头。
示例:
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <errno.h>
  4. #include <string.h>

  5. int main(void) {

  6.         char buff[] = "hello world\n";
  7.         //1 2 都是输出到控制台
  8.         int len = 0;
  9.         len = write(1, buff, sizeof(buff));//标准输出
  10.         if (len < 0) {
  11.                 printf("write failed.reason:%s\n",strerror(errno));
  12.         }
  13.         len = write(2, buff, sizeof(buff));//标准出错输出
  14.         if (len < 0) {
  15.                 printf("write failed.reason:%s\n", strerror(errno));
  16.         }
  17.         return 0;
复制代码

【Linux】Linux文件结构及操作方式

【Linux】Linux文件结构及操作方式


read
从一个文件描述符中读取count个字节到buff中。

返回值:
· 大于0——实际读取的字节数
· 0——已读到文件尾
· -1——出错

注意:
· 参数3表示最多能接受的字节数,而不是指一定要输入的字节数。

示例:
  1. char buffer[1024];
  2. int cnt = read(0,buffer,sizeof(buffer));//从标准输入读
复制代码

open
  1. int open(const char *pathname, int flags);
  2. int open(const char *pathname, int flags, mode_t mode);
复制代码

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

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

参数3:设置权限
·
注意:

· 返回的文件描述符是该进程未打开 的最小的文件描述符。
示例:
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. #include <errno.h>
  8. #include <string.h>
复制代码

【Linux】Linux文件结构及操作方式

【Linux】Linux文件结构及操作方式

提示:!gcc——重新执行gcc上次编译的命令

close
  1. int close(int fd);
复制代码
关闭文件

终止指定文件描述符与对应文件之间的关联。
并释放该文件描述符,即该文件描述符可被重新使用。

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

示例:
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. #include <errno.h>
  8. #include <string.h>
复制代码
提示:
· 观察耗时:time xxx
· 程序总的执行时间
· 程序本身所消耗的时间
· 系统调用所消耗的时间

【Linux】Linux文件结构及操作方式

【Linux】Linux文件结构及操作方式


lseek
  1. off_t lseek(int fd, off_t offset, int whence);
复制代码
重新定义读写文件的偏移。

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

示例:从一个文件偏移100处,拷贝100字节到另一个文件。
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. #include <errno.h>
  8. #include <string.h>
  9. #define  FILE1_NAME "lseek_test.c"
  10. #define  FILE2_NAME "lseek_test2.txt"
  11. #define  SIZE 100
  12. int main(void) {
  13.         int file1, file2;
  14.         char buffer[1024];
  15.         int ret;
  16.         file1 = open(FILE1_NAME, O_RDONLY);
  17.         if (file1 < 0) {
  18.                 printf("open file failed! reason:%s\n", strerror(errno));
  19.                 exit(-1);
  20.         }
  21.         file2 = open(FILE2_NAME, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
  22.         if (file2 < 0) {
  23.                 printf("open file failed! reason:%s\n", strerror(errno));
  24.                 exit(-2);
  25.         }
  26.         //文件句柄,偏移量,从哪偏移
  27.         ret = lseek(file1, 0, SEEK_END);
  28.         printf("file size: %d\n", ret);
  29.         ret = lseek(file1, 100, SEEK_SET);
  30.         printf("lseek ret:%d\n", ret);
  31.         ret = read(file1, buffer, SIZE);
  32.         if (ret > 0) {
  33.                 buffer[ret] = '\0';
  34.                 write(file2,buffer,SIZE);
  35.         }
  36.         close(file1);
  37.         close(file2);
  38.         return 0;
复制代码

ioctl
嵌入式相关
ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性接口进行控制,例如串口的传输波特率、马达的转速等等。是设备驱动程序中设备控制接口函数,用来控制设备。
  1. int ioctl(int fd, int cmd,[int *argdx, int argcx]);
复制代码
· fd是用户程序打开设备时使用open函数返回的文件标示符,
· cmd是用户程序对设备的控制命令,后面是一些补充参数,一般最多一个,这个参数的有无和cmd的意义相关。

感谢您的阅读,服务器大本营-技术文章内容集合站,助您成为更专业的服务器管理员!
一入IDC深似海,从此你我是良人!
您需要登录后才可以回帖 登录 | 我要入营

本版积分规则

Loading...

QQ|Archiver|手机版|网站地图|服务器大本营 ( 赣ICP备2021009089号 )

GMT+8, 2024-10-24 05:57 , Processed in 0.090388 second(s), 28 queries , Gzip On.

Powered by 服务器大本营

© 2021-2023 联系飞飞

快速回复 返回顶部 返回列表