当前位置:首页 > CN2资讯 > 正文内容

【Linux】Linux文件

1天前CN2资讯


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)查看

注意:

  • 从文件当前指针位置开始写入。文件刚打开时从文件指针指向文件头。

示例:

#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 < 0) {
printf("write failed.reason:%s\n",strerror(errno));
}
len = write(2, buff, sizeof(buff));//标准出错输出
if (len < 0) {
printf("write failed.reason:%s\n", strerror(errno));
}
return 0;
}


read

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

返回值:

  • 大于0——实际读取的字节数
  • 0——已读到文件尾
  • -1——出错

注意:

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

示例:

char buffer[1024];
int cnt = read(0,buffer,sizeof(buffer));//从标准输入读

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 如果文件不存在,则创建该文件,并使用第3个参数设置权限,如果文件存在 ,则只打开文件。
  • O_EXCL 如果同时使用O_CREAT而且该文件又已经存在

时,则返回错误, 用途:以防止多个进程同时创建

同一个文件

  • O_APPEND 尾部追加方式(打开后,文件指针指向文件的末尾)
  • O_TRUNC 若文件存在,则长度被截为0,属性不变

参数3:设置权限

注意:

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

示例:

#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_AOOEND —— 追加
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 < 0) {
printf("open failed!,reason :%s\n",strerror(errno));
exit(-1);
}

count = write(fd, buffer, strlen(buffer));

printf("written: %d bytes\n",count);

close(fd);

return 0;
}

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


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 < 0) {
printf("open file failed! reason:%s\n",strerror(errno));
exit(-1);
}

file2 = open(FILE2_NAME, O_CREAT | O_WRONLY ,S_IRUSR | S_IWUSR);
if (file2 < 0) {
printf("open file failed! reason:%s\n", strerror(errno));
exit(-2);
}

while (len = read(file1, buffer, sizeof(buffer) > 0)) {
write(file2,buffer,len);
}

close(file2);//实战记得判断是否关闭成功
close(file1);


return 0;
}

提示:

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


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 < 0) {
printf("open file failed! reason:%s\n", strerror(errno));
exit(-1);
}

file2 = open(FILE2_NAME, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
if (file2 < 0) {
printf("open file failed! reason:%s\n", strerror(errno));
exit(-2);
}

//文件句柄,偏移量,从哪偏移

ret = lseek(file1, 0, SEEK_END);
printf("file size: %d\n", ret);

ret = lseek(file1, 100, SEEK_SET);
printf("lseek ret:%d\n", ret);

ret = read(file1, buffer, SIZE);
if (ret > 0) {
buffer[ret] = '\0';
write(file2,buffer,SIZE);
}

close(file1);
close(file2);


return 0;
}

ioctl

嵌入式相关

ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性接口进行控制,例如串口的传输波特率、马达的转速等等。是设备驱动程序中设备控制接口函数,用来控制设备。

int ioctl(int fd, int cmd,[int *argdx, int argcx]);
  • fd是用户程序打开设备时使用open函数返回的文件标示符,
  • cmd是用户程序对设备的控制命令,后面是一些补充参数,一般最多一个,这个参数的有无和cmd的意义相关。


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/25221.html

    分享给朋友:

    “【Linux】Linux文件” 的相关文章

    香港服务器CN2线路解析:为什么它是全球企业的首选?

    随着全球化进程的加速,越来越多的企业需要在跨境业务中实现高效的数据传输和稳定的网络连接。而作为国际金融中心,香港因其优越的地理位置和成熟的网络基础设施,成为全球企业部署服务器的热门选择。在众多服务器解决方案中,香港服务器CN2线路因其卓越的性能和稳定性,受到了广泛的关注和青睐。香港服务器CN2线路到...

    国外CDN推荐:提升网站速度与安全的选择

    在这个数字化时代,CDN(内容分发网络)的重要性逐渐凸显。许多网站为了提高用户体验,确保内容能够快速、安全地到达用户的设备,纷纷开始引入CDN服务。那么,CDN到底是什么?它的功能和运作原理又是怎样的呢? 简单来说,CDN是一个分布式的网络,旨在提高网站的加载速度和可用性。它通过在全球范围内部署一系...

    如何使用NameSilo优惠码享受域名注册折扣

    在寻找域名注册服务时,NameSilo可能是你一个不错的选择。它以其友好的价格和高质量的服务以及多样化的优惠活动而受到用户青睐。尤其当我第一次尝试注册域名时,NameSilo给我的第一印象便是其简单易用的注册流程和丰厚的折扣方式。 使用NameSilo的最大的优势之一,就是能够享受到各种折扣码。许多...

    GPU租用市场的崛起与行业应用分析

    在过去的几年中,GPU租用市场的发展速度让我惊叹,真的如雨后春笋般冒出。随着科技的不断进步和市场需求的增长,越来越多的人选择租用GPU来满足高性能计算的需求。这种选择不仅适用于企业,也吸引了许多个人用户。GPU租用为我们提供了便利,加速了各类计算密集型任务的完成。 GPU租用的定义非常简单,就是将高...

    深入了解DMIT不同线路,优化您的网络体验

    在开始深入了解DMIT这一知名VPS提供商之前,我想先分享一下我对于它的初步印象。DMIT的使命是为用户提供高性能、稳定的VPS解决方案,特别是在跨境访问方面表现不俗。他们采用的CN2优化线路更是让其在众多竞争对手中脱颖而出。通过不断的发展与创新,DMIT为不同需求的用户提供了多种线路选择。 DMI...

    如何获取免费VPS服务无需信用卡:一站式指南

    在互联网时代,虚拟专用服务器(VPS)成为了很多开发者和企业的优选。VPS基本上是一个分隔的服务器环境,用户可以在其中安装操作系统和运行应用程序。它既拥有独立服务器的功能,又比共享主机更具经济性。对很多人来说,了解VPS的运行机制和它的适用场景是非常重要的。 免费VPS服务越来越受到关注。在预算有限...