LINUX系统编程

news/2024/11/8 17:08:14/

文章目录

  • linux系统介绍(属于扯闲篇)
    • linux的概况
    • linux的历史
      • 起源unix
      • Posix标准和其他标准
      • 开源运动
      • linux的诞生
    • linux使用
      • 使用范围
      • linux的登录
  • linux常用命令
    • linux的shell使用
      • 切换用户
      • 显示所有用户
      • 退出当前用户
      • 添加用户
    • 删除用户
    • 当前工作目录
    • 当前工作目录下的所有文件
    • 改变当前工作目录
    • 创建目录
    • 删除目录
    • 拷贝文件或者目录
    • 移动文件或者目录
    • 书目录结构显示
    • 修改权限
    • 掩码
    • 这里仅仅做linux的部分介绍所以不详细,详细需要学习linux相关教程
    • 安装相应的帮助手册
  • 文件操作
    • 基于文件指针的文件操作
    • linux文件的打开与关闭
    • 关闭文件
    • fread和fwrite函数
    • 格式化读写
    • 目录操作
    • 修改目录
    • 创建和删除文件夹
    • stat获取文件信息
  • 未完待续

linux系统介绍(属于扯闲篇)

linux的概况

Linux是一种免费、开源的操作系统,最初由芬兰的Linus Torvalds在1991年开发。它是Unix-like操作系统的一种,具有高度的可定制性和灵活性。Linux操作系统包括内核和一组用户空间程序,可以运行在各种硬件平台上。

Linux的特点包括安全性高、稳定性强、性能卓越、可移植性好、多用户多任务支持等。Linux也支持多种桌面环境,如GNOME、KDE、XFCE等,用户可以根据自己的需要进行选择。

目前,Linux已经成为服务器领域的主流操作系统,被广泛用于Web服务器、数据库服务器、云计算等领域。同时,Linux也被越来越多的个人用户所使用,如开发人员、科学家、艺术家等。

linux的历史

在这里插入图片描述

起源unix

Unix 是一种操作系统,它最初由贝尔实验室开发并于 1970 年代初开始使用。Unix 系统是多用户、多任务和支持网络的操作系统,被广泛地用于服务器、工作站和移动设备等各种场合。

Unix 操作系统有许多不同版本,包括商业版本(如 Solaris、HP-UX、AIX 和 macOS)和自由软件版本(如 Linux 和 FreeBSD)。Unix 系统采用了分层的设计方式,其中核心(kernel)是操作系统的核心部分,负责管理硬件和提供基本服务。其他组件则往往是一些标准工具和应用程序,如 shell、编辑器、编译器和数据库等。Unix 系统也提供了强大的命令行界面和脚本语言,使得用户能够方便地进行自动化和批处理操作。

Unix 系统的优点包括稳定性、安全性、可靠性、灵活性和可定制性。这些特点使得 Unix 系统在服务器领域得到了广泛的应用,而且也为开发者提供了一个极好的开发平台。

Posix标准和其他标准

POSIX(可移植操作系统接口)是一个被 IEEE 组织标准化的接口规范,旨在使得不同 Unix 系统间的软件可以互通。POSIX 标准定义了许多基本操作、文件系统、进程管理、线程和 IPC 等方面的 API,以及各种环境变量和配置参数,这些都是 Unix 操作系统中常用的功能。

除了 POSIX 标准外,还有一些其他标准对于操作系统也非常重要。其中最重要的标准之一是 C 语言的 ANSI C 标准和 ISO C 标准,它们定义了 C 语言的语法、语义、库函数等方面的规范。由于许多操作系统都使用 C 语言编写,因此这些标准为开发者提供了一个统一的编程接口。

另一个重要的标准是 TCP/IP 协议族,它是 Internet 上应用最广泛的协议族,定义了数据传输的各个层次的协议。操作系统需要支持 TCP/IP 协议族才能进行网络通信和 Internet 访问。

此外,还有许多其他标准与操作系统相关,如编译器前端和后端的标准、文件格式的标准、安全性标准等等。这些标准都是操作系统开发者需要知道和掌握的内容。

开源运动

开源运动的兴起可以追溯到二十世纪九十年代,当时一些软件开发者开始将自己编写的代码公开发布,并使用自由软件许可证授权他人使用、修改和分发这些代码。这样做的目的是为了推广自由软件的理念,鼓励更多的人贡献自己的力量,同时也为了避免专有软件的限制和不公平。

随着互联网的普及,开源运动逐渐得到了越来越多的支持者和参与者。开源模式具有高度的灵活性和适应性,它可以在全球范围内进行协作,吸引了大量的开发者和用户参与其中。同时,开源软件的质量也受到了广泛认同,很多开源软件已经成为商业系统中不可或缺的组成部分。

开源运动的兴起还促进了知识共享和技术创新的发展。开源社区提倡合作和交流,使得参与者可以共同学习和解决问题。通过开放的合作模式,开源项目能够在更短的时间内获得更多的创意和想法,这对于技术创新来说非常重要。

总的来说,开源运动的兴起是一个重要的历史事件,它推动了软件行业的变革,促进了自由和开放的文化氛围,同时也为技术创新提供了更广阔的空间。

linux的诞生

Linux的历史可以追溯到1991年,当时一个名为Linus Torvalds的芬兰大学生开始编写一个新的操作系统内核。他的目标是开发一种类Unix的操作系统内核,能够在他的个人计算机上运行。

最初,Linus发布了这个内核的版本0.01,并将其上传到互联网上供其他人试用和改进。随着时间的推移,越来越多的程序员参与到Linux内核的开发中,帮助完善它的功能和性能。

Linux很快就成为了自由软件运动的一部分,因为它是开源的并且许可证允许用户自由地使用、修改和传播它。随着Linux的不断发展,许多组织和公司开始支持和使用它。例如,Red Hat和SUSE等公司提供商业版的Linux发行版,并获得了商业成功。

现在,Linux已经成为世界上最流行的操作系统之一,被广泛应用于服务器、桌面、嵌入式系统、移动设备等领域。同时,Linux社区也非常活跃,开发出了众多优秀的开源软件和工具,为用户提供了无限的可能。

成功原因
Linux 之所以能够成功,有以下几个方面的原因:

  • 开源:Linux 是一款开源操作系统,这意味着任何人都可以查看其代码、修改和分发,这种开放性吸引了大量技术人员参与到 Linux 的开发中来。同时,开源模式还促进了知识共享和技术创新的发展。

  • 自由软件许可证:Linux 使用自由软件许可证(GPL),这使得用户可以自由地使用、修改和分发 Linux 系统,而不需要支付任何费用。这种免费的授权方式吸引了大量用户和企业采用 Linux 系统。

  • 可定制性:Linux 拥有高度的可定制性,用户可以根据自己的需求选择适合自己的组件和配置参数,这使得 Linux 能够在不同的场景下得到广泛的应用。

  • 多平台支持:Linux 可以运行在多种硬件平台上,包括 PC、服务器、嵌入式设备等等。这使得 Linux 成为了一种非常灵活和通用的操作系统。

  • 社区支持:Linux 拥有庞大的用户和开发者社区。这些社区成员提供了丰富的技术资源和支持,使得 Linux 用户可以得到及时的帮助和解决方案。

总的来说,Linux 之所以能够成功,是因为它具有强大的可定制性、开放的开发模式、自由软件许可证、多平台支持和庞大的社区支持。这些因素使得 Linux 成为了一款非常灵活、强大和受欢迎的操作系统。

linux的版本
Linux 是一种开放源代码的操作系统,可以基于其内核构建各种不同版本的 Linux 操作系统。这些不同版本的 Linux 被称为“发行版”(Distribution,缩写为 Distro),它们通常根据用户的需求和偏好,或特定领域的应用进行优化和定制。

以下是几个知名的 Linux 发行版:

  1. Ubuntu:由 Canonical 公司开发和维护的基于 Debian 的 Linux 发行版,以易用性和稳定性著称,广泛应用于桌面、服务器和云平台等场景。
  2. Red Hat Enterprise Linux:由 Red Hat 公司开发和维护的商业 Linux 发行版,主要用于企业级服务器和工作站,提供高可靠性和安全性。
  3. Fedora:由社区驱动的 Linux 发行版,由 Red Hat 公司支持,以最新的软件包和技术为特点。
  4. CentOS:由社区维护的免费 Linux 发行版,以稳定性和安全性闻名,主要用于企业级服务器和工作站。
  5. Debian:由社区开发和维护的免费 Linux 发行版,以稳定性和可靠性著称,广泛应用于服务器和桌面环境。
  6. Arch Linux:由社区维护的适合高级用户的 Linux 发行版,具有高度的灵活性和可定制性,提供了最新的软件包和最新的功能。

此外,还有很多其他的 Linux 发行版,它们都根据特定的需求或目标进行优化和定制,如 Kali Linux 用于网络安全、Raspbian 用于树莓派等。

linux使用

使用范围

Linux 是一种功能强大、灵活并且免费的操作系统,可以应用于各种场景和用途。以下是 Linux 的一些常见使用场景:

  1. 服务器:Linux 在服务器领域得到了广泛应用,因为它具有高可靠性、安全性和稳定性。许多互联网公司、数据中心和云计算服务提供商都在使用 Linux 系统。
  2. 桌面:Linux 可以作为桌面操作系统来使用,提供和其他桌面操作系统相同的功能和应用。这些桌面环境包括 GNOME、KDE Plasma、Cinnamon 等。
  3. 移动设备:Android 是基于 Linux 内核构建的移动操作系统,广泛应用于智能手机、平板电脑等移动设备上。
  4. 嵌入式系统:Linux 还被广泛用于嵌入式设备的控制系统、网络设备等方面。
  5. 开发平台:Linux 提供了丰富的开发工具和编程环境,可以作为软件开发平台使用,支持多种编程语言和开发框架。

总的来说,Linux 是一种非常灵活、强大的操作系统,它可以应用于各种场景和用途。无论是在服务器、桌面、移动设备、嵌入式系统还是开发平台,Linux 都提供了高度的可定制性和灵活性,使得用户能够根据自己的需求选择适合自己的发行版和应用程序。

linux的登录

在 Linux 操作系统中,登录通常有两种方式:本地登录和远程登录。

  • 本地登录:本地登录是指用户直接使用计算机进行登录。通常在启动或重新启动后,Linux 系统会进入命令行界面或图形化界面,用户需要输入对应的用户名和密码进行登录。

  • 远程登录:远程登录是指用户通过网络连接到远程 Linux 计算机进行登录。可以使用 SSH(Secure Shell)协议来实现远程登录。首先确保目标计算机已安装并启动了 SSH 服务,在本地计算机上打开一个可用的终端窗口,输入以下命令:

ssh username@ip_address

其中,username 是目标计算机上的有效用户账户名,ip_address 是目标计算机的 IP 地址。然后输入相应的密码即可登录到远程 Linux 计算机。

在登录后,用户可以执行各种命令来管理文件、安装软件和配置系统等操作。为了保证系统的安全性,用户登录后应该避免使用 root 账户直接操作系统,而是使用普通用户账户进行常规操作,必要时再使用 sudo 或 su 命令获取 root 权限。同时,用户也应该定期更改密码,并且只使用合法来源的软件和命令。

cat /etc/passwd

cat /etc/shadow

uname -a # 查看内核版本

Linux jonaton-linux 5.15.0-60-generic #66-Ubuntu SMP Fri Jan 20 14:29:49 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

linux常用命令

由于linux基本上都是远程链接使用所以要试一下网络连接。

ifconfig 	#可以看到网络信息

在这里插入图片描述

ping  alibaba.com#注意没有被墙的网站可以访问,而clash等软件是在应用层所以并不能被ping通

在这里插入图片描述
一般情况下默认安装了ssh,所以可以pass掉安装过程

linux的shell使用

由于使用ubuntu所以所有的使用,基于Ubuntu

sudo passwd root

切换用户

su user_name

当嵌套使用su指令来依次进入多个用户时候,多个用户是使用 栈结构 来管理的。执行su指令相当于将
新用户压入栈顶,执行exit指令相当于弹出栈顶

显示所有用户

$cat /etc/passwd

退出当前用户

exit

添加用户

useradd 用户名

只有root用户或者拥有sudo权限的用户使用sudo命令后才能添加用户


#给useradd命令添加参数,在用户名之前使用-m,可以为用户添加默认家目录(如果不添加家目录,这个用户将无法创建文件)。
# 添加用户并指定家目录
$ useradd -m 用户名 -s /bin/bash
#执行完命令,先使用pwd命令获取当前工作目录,使用cd命令进入/home目录,再使用ls命令显示当前
#目录下的所有文件。就会发现home的下面新建了一个新的目录,目录的名字就是用户名,这里就是新用户的家目录
pwd
cd /home

在这里插入图片描述
在这里插入图片描述

删除用户

$userdel 用户名如果用户正在使用中,那么这个用户就不能被删除
如果用户在su命令和exit命令构成的用户 栈结构 当中的时候,那么这个用户也不能被删除
在userdel后面添加-r选项,可以删除用户家目录下的文件
$userdel -r 用户名

在这里插入图片描述
在这里插入图片描述

当前工作目录

pwd

当前工作目录下的所有文件

lsls  工作路径

改变当前工作目录

cd 

创建目录

mkdir 目录名

删除目录

rmdir 目录名如果文件夹中由文件
rmdir -r 目录名

拷贝文件或者目录

cp [选项] 源文件 目标路径|目标文件cp -r dir1 path  

移动文件或者目录

mv [选项] 源文件 目标路径|目标文件

书目录结构显示

一般情况下没有安装tree
所以

sudo apt install tree
使用tree命令就可以显示目录的树状结构
$tree 路径名

在这里插入图片描述

修改权限

在 Linux 中,可以使用命令 chmod 来修改文件或目录的权限。 chmod 命令需要指定三个数字参数来表示文件的权限:用户权限、组权限和其他人权限。

每个数字参数都是由三个数字组成的,分别代表读(r)、**写(w)执行(x)**这三种权限。每种权限用一个二进制位表示,读权限用1表示,写权限用2表示,执行权限用4表示。因此,一个数字参数就是将这三种权限对应的二进制位相加得到的。

例如,数字参数为 7 表示所有权限都被打开,即 rwx;数字参数为 6 表示读和写权限被打开,即 rw-。

在 Linux 中,可以使用两种方式来修改文件或目录的权限:文字设定法和数字设定法。

文字设定法是指通过符号来表示权限。具体地说,可以使用 ugo 分别表示用户、组和其他人,并且可以用 +-= 来分别表示添加、删除和设置权限。例如:

# 将 file.txt 的执行权限授予当前用户
chmod u+x file.txt# 将 dir 目录及其所有子目录和文件的读取、写入和执行权限授予用户和组,但不授予其他人
chmod g+rwx,u+rwx,o-rwx -R dir/

数字设定法是指通过数字来表示权限。具体地说,可以使用三个八进制数来表示用户、组和其他人的权限,其中每个八进制数由三个二进制位来表示读、写和执行权限。例如:

# 将 file.txt 的所有权限都授予用户和组,但不授予其他人
chmod 660 file.txt# 将 dir 目录及其所有子目录和文件的读取、写入和执行权限授予所有用户
chmod 777 -R dir/

注意,在数字设定法中,每个八进制数所代表的权限是固定的,无法灵活地进行单独的权限修改。因此,相对来说,文字设定法更加直观和易于理解。

掩码

在 Linux 中,还有一种与文件和目录权限相关的概念叫做掩码(umask)。掩码是一个八进制数字,用来指定新创建的文件或目录应该限制哪些权限。具体地说,掩码中每个二进制位代表一个特定的文件权限(读、写、执行),如果对应位上的数值为 0,则表示新文件或目录会保留该权限,反之则表示该权限会被限制。

例如,如果掩码设置为 022,则新创建的文件的权限为 rw-r--r--,新创建的目录权限为 rwxr-xr-x。这是因为在 Linux 中,新建的文件会自动继承创建它的目录的权限,但同时会受到掩码的限制,即默认会关闭掉执行权限。同样地,新建的目录也会继承创建它的目录的权限,并且默认会开启所有权限。

要查看当前系统的掩码设置,可以使用 umask 命令。要修改掩码设置,可以直接使用 umask 命令加上合适的参数,例如:

# 将掩码设置为 027,即新建的文件只有用户有读取和执行权限,组和其他人无任何权限
umask 027

需要注意的是,掩码不影响已经存在的文件和目录的权限,只会影响新创建的文件和目录。如果需要修改已有文件或目录的权限,需要使用 chmod 命令进行修改。

这里仅仅做linux的部分介绍所以不详细,详细需要学习linux相关教程

安装相应的帮助手册

$ sudo apt install manpages-posix-dev

文件操作

基于文件指针的文件操作

Linux 是一个基于 Unix 的操作系统,它使用一种树形目录结构来组织文件。在 Linux 中,所有的文件都位于根目录下的一个文件系统中,并且可以通过路径名来访问。

Linux 中的文件可以分为几类:

  • 普通文件:这是最常见的一种文件类型,包括文本文件、二进制文件等。

  • 目录文件:目录文件是一种特殊的文件类型,它包含了其他文件或目录的列表。

  • 设备文件:设备文件是用于访问硬件设备的文件,例如磁盘驱动器、打印机等。

  • 符号链接文件:符号链接文件是指向其他文件或目录的文件,类似于 Windows 中的快捷方式。

  • 套接字文件:套接字文件用于进行进程间通信。

  • 管道文件:管道文件也用于进程间通信,但只能支持单向通信。

除了以上文件类型之外,Linux 中还有一些其他的特殊文件类型,例如权限文件、FIFO 文件等。

linux文件的打开与关闭

//所需头文件和相应的参数
SYNOPSISSYNOPSIS#include <stdio.h>FILE *fopen(const char *pathname, const char *mode);FILE *fdopen(int fd, const char *mode);FILE *freopen(const char *pathname, const char *mode, FILE *stream);Feature Test Macro Requirements for glibc (see feature_test_macros(7)):fdopen(): _POSIX_C_SOURCE

在这里插入图片描述
打开成功时候返回一个文件指针

函数fopen()中的mode参数用于指定文件的打开模式。以下是常见的模式选项:

  • “r” 只读方式打开文件,该文件必须已经存在。
  • “w” 写入方式打开文件,如果文件不存在则会创建该文件,如果文件已经存在则将文件内容清空。
  • “a” 追加方式打开文件,如果文件不存在则会创建该文件,如果文件已经存在则在文件末尾追加内容。
  • “r+” 读写方式打开文件,该文件必须已经存在。
  • “w+” 读写方式打开文件,如果文件不存在则会创建该文件,如果文件已经存在则将文件内容清空。
  • “a+” 读写方式打开文件,如果文件不存在则会创建该文件,如果文件已经存在则在文件末尾追加内容。

在这些模式选项后面还可以添加“b”字符,以表示二进制模式。例如,“rb”表示以只读方式打开一个二进制文件。

关闭文件


//关闭文件需要的头文件和参数
SYNOPSIS#include <stdio.h>int fclose(FILE *stream);

fread和fwrite函数

SYNOPSIS#include <stdio.h>size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
  • 第一个参数是一个指向要写入数据的内存块的指针。
  • 第二个参数是每个数据项的字节数。
  • 第三个参数是要写入的数据项数。
  • 第四个参数是指向FILE结构体的指针,表示要写入的文件。

格式化读写

#include <stdio.h>
int printf(const char *format, ...);
//相当于fprintf(stdout,format,…);
int scanf(const char *format,);
int fprintf(FILE *stream, const char *format, ...);
int fscanf(FILE *stream, const char *format,);
int sprintf(char *str, const char *format, ...);
//eg:sprintf(buf,”the string is;%s”,str);
int sscanf(char *str, const char *format,);

fprintf将格式化后的字符串写入到文件流stream中
sprintf将格式化后的字符串写入到字符串str中

char *fgets(char *s, int size, FILE *stream);
int fputs(const char *s, FILE *stream);
int puts(const char *s);//等同于 fputs(const char *s,stdout);
char *gets(char *s);//等同于 fgets(const char *s, int size, stdin);
  • fgets和fputs从文件流stream中读写一行数据;
  • puts和gets从标准输入输出流中读写一行数据。
  • fgets可以指定目标缓冲区的大小,所以相对于gets安全,但是fgets调用时,如果文件中当前行的
  • 字符个数大于size,则下一次fgets调用时,将继续读取该行剩下的字符,fgets读取一行字符时,保留行尾的换行符。
  • fputs不会在行尾自动添加换行符,但是puts会在标准输出流中自动添加一换行符。
  • 文件定位:文件定位指读取或设置文件当前读写点,所有的通过文件指针读写数据的函数,都是从文件的当前
    读写点读写数据的。常用的函数有:
#include <stdio.h>
int feof(FILE * stream);
//通常的用法为while(!feof(fp)),没什么太多用处
int fseek(FILE *stream, long offset, int whence);
//设置当前读写点到偏移whence 长度为offset处
long ftell(FILE *stream);
//用来获得文件流当前的读写位置
void rewind(FILE *stream);
//把文件流的读写位置移至文件开头 fseek(fp, 0, SEEK_SET);
#include <sys/stat.h>
int chmod(const char* path, mode_t mode);
//mode形如:0777 是一个八进制整型
//path参数指定的文件被修改为具有mode参数给出的访问权限。

目录操作

获取、改变当前目录

//获取当前目录
char *getcwd(char *buf, size_t size);char *getwd(char *buf);char *get_current_dir_name(void);

在这里插入图片描述

  • getcwd()` 是一个函数,它的作用是获取当前工作目录(Current Working Directory),即程序当前所在的目录路径。

    在使用 getcwd() 函数时,需要包含头文件 <unistd.h>。该函数的原型如下:

    Copy Codechar *getcwd(char *buf, size_t size);
    

    其中,buf 参数是一个指向存储路径名的缓冲区的指针,size 参数表示缓冲区大小。如果 buf 参数为 NULL,则 getcwd() 会自动分配一个适当大小的缓冲区。调用成功后,buf 指向包含当前工作目录的字符串,返回值为 buf

#include <stdio.h>
#include <unistd.h>int main() {char buf[1024];if (getcwd(buf, sizeof(buf)) != NULL) {printf("Current working directory: %s\n", buf);} else {perror("Error");return 1;}return 0;
}

修改目录

  #include <unistd.h>int chdir(const char *path);

在这里插入图片描述

创建和删除文件夹

#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int mkdir(const char *pathname, mode_t mode); //创建目录,mode是目录权限
int rmdir(const char *pathname); //删除目录

目录的存储原理

  • Linux的文件系统采用了一种树形结构,称为“目录树”或者“文件系统层次结构”,它由许多的目录和文件组成,每个目录都可以包含其他目录和文件,形成了一个分层的结构。

    在Linux中,所有的目录和文件都存储在虚拟文件系统(Virtual File System,VFS)中。这个虚拟文件系统将硬件和文件系统之间进行了抽象,使得不同的文件系统可以使用相同的接口操作。

    Linux文件系统的目录结构是以根目录(/)作为起点的,所有的目录都是从根目录开始展开的。例如,/usr/bin表示usr目录下的bin子目录。在Linux中有一些特殊的目录,如下:

    1. /:根目录,所有的文件和目录都是从这里开始。
    2. /bin:存放系统命令(binary)的目录。
    3. /sbin:存放系统管理员使用的命令(system binary)。
    4. /etc:存放系统配置文件(configuration)的目录。
    5. /dev:存放设备文件(device)的目录。
    6. /proc:存放进程信息(process)的目录。
    7. /var:存放系统运行时需要变化的文件(variable)的目录。
    8. /home:存放用户主目录(homedir)的目录。

    在Linux中,所有的目录和文件都有权限控制,可以设置哪些用户或组可以访问它们。此外,因为Linux是支持多用户的操作系统,每个用户都有自己的主目录,这样不同的用户之间可以互相隔离,保证了系统的安全性。

struct __dirstream{void *__fd;char *__data;int __entry_data;char *__ptr;int __entry_ptr;size_t __allocation;size_t __size;__libc_lock_define (, __lock)};
typedef struct __dirstream DIR;

在 Linux 中,你可以使用 C 语言标准库中的函数来管理和操作文件目录。以下是一些常见的函数及其参数:

  1. opendir() 函数:

    DIR *opendir(const char *name);
    

    参数:

    • name:要打开的目录的路径名。

    返回值:

    • 如果打开目录成功,则返回一个指向 DIR 类型结构体的指针。
    • 如果出错,则返回 NULL,并设置相应的错误码(通过 errno 变量获取)。
  2. readdir() 函数:

    struct dirent *readdir(DIR *dirp);
    

    参数:

    • dirp:先前由 opendir() 打开的目录指针。

    返回值:

    • 如果读取下一个目录项成功,则返回一个指向 dirent 类型结构体的指针。
    • 如果已到达目录末尾或出现错误,则返回 NULL,并设置相应的错误码(通过 errno 变量获取)。
  3. closedir() 函数:

    int closedir(DIR *dirp);
    

    参数:

    • dirp:先前由 opendir() 打开的目录指针。

    返回值:

    • 如果成功关闭目录,则返回 0。
    • 如果出错,则返回 -1,并设置相应的错误码(通过 errno 变量获取)。
  4. mkdir() 函数:

    int mkdir(const char *path, mode_t mode);
    

    参数:

    • path:要创建的目录路径名。
    • mode:新目录的权限和属性。可以使用 chmod() 函数修改它。

    返回值:

    • 如果成功创建目录,则返回 0。
    • 如果出错,则返回 -1,并设置相应的错误码(通过 errno 变量获取)。
  5. rmdir() 函数:

    int rmdir(const char *pathname);
    

    参数:

    • pathname:要删除的目录路径名。

    返回值:

    • 如果成功删除目录,则返回 0。
    • 如果出错,则返回 -1,并设置相应的错误码(通过 errno 变量获取)。
  6. chdir() 函数:

     int chdir(const char *path);
    
参数:- `path`:要更改为的目录路径名。返回值:- 如果成功更改当前工作目录,则返回 0。- 如果出错,则返回 -1,并设置相应的错误码(通过 `errno` 变量获取)。7. `getcwd()` 函数:

char *getcwd(char *buf, size_t size);


参数:- `buf`:用于存储当前工作目录的缓冲区指针。
- `size`:缓冲区大小。返回值:- 如果成功获取当前工作目录,则返回指向缓冲区的指针。
- 如果出错,则返回 NULL,并设置相应的错误码(通过 `errno` 变量获取)。8. `rename()` 函数:
rename(const char *oldpath, const char *newpath);

参数:- `oldpath`:要重命名的文件或目录的路径名。
- `newpath`:新的文件或目录的路径名。返回值:- 如果成功重命名文件或目录,则返回 0。
- 如果出错,则返回 -1,并设置相应的错误码(通过 `errno` 变量获取)。**下面例子是深度遍历访问目录的例子**
```c//使用深度优先遍历访问目录的例子
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>void listdir(const char *name, int indent, int depth)
{if (depth <= 0) {printf("%*s[%s]\n", indent, "", "...");return;}DIR *dir = opendir(name);if (!dir) {fprintf(stderr, "Error: Cannot open directory '%s'\n", name);return;}struct dirent *entry;while ((entry = readdir(dir)) != NULL) {if (entry->d_type == DT_DIR) {if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)continue;printf("%*s└─ %s/\n", indent, "", entry->d_name);char path[1024];snprintf(path, sizeof(path), "%s/%s", name, entry->d_name);listdir(path, indent + 2, depth - 1);} else {printf("%*s└─ %s\n", indent, "", entry->d_name);}}closedir(dir);
}int main(int argc, char **argv)
{if (argc != 2) {fprintf(stderr, "Usage: %s <directory>\n", argv[0]);return 1;}printf("目录:%s\n", argv[1]);listdir(argv[1], 0, 3); // 限制递归深度为 3 层return 0;
}

stat获取文件信息

在这里插入图片描述

#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>int main() {char* filename = "your_file_path";struct stat file_stat;if(stat(filename, &file_stat) != 0) {perror("Error in getting file stat");return -1;}printf("File stat for %s\n", filename);printf("-----------------------------------\n");printf("Mode: %o\n", file_stat.st_mode);printf("Inode number: %lu\n", file_stat.st_ino);printf("Device ID: %lu\n", file_stat.st_dev);printf("Number of hard links: %lu\n", file_stat.st_nlink);printf("UID of owner: %d\n", file_stat.st_uid);printf("GID of owner: %d\n", file_stat.st_gid);printf("Size in bytes: %ld\n", file_stat.st_size);printf("Last access time: %ld\n", file_stat.st_atime);printf("Last modification time: %ld\n", file_stat.st_mtime);printf("Last status change time: %ld\n", file_stat.st_ctime);return 0;
}

未完待续


http://www.ppmy.cn/news/99805.html

相关文章

SpringMVC框架面试专题(初级-中级)-第九节

欢迎大家一起探讨&#xff5e;如果可以帮到大家请为我点赞关注哦&#xff5e;后续会持续更新 问题&#xff1a; 1.Spring MVC框架中的参数校验是什么&#xff1f;请举例说明如何使用参数校验。 解析&#xff1a; Spring MVC框架中的参数校验是指在Controller层对用户传入的…

Shell脚本break和continue语句应用

记录&#xff1a;436 场景&#xff1a; Shell脚本break和continue语句应用。在for、while循环中使用break和continue语句。 版本&#xff1a;CentOS Linux release 7.9.2009。 1.break和continue语句 break语句用来结束循环语句&#xff0c;会跳出循环&#xff0c;不再执行…

【C++】——vector的介绍及模拟实现

文章目录 1. 前言2. vector的介绍3. vector的常用接口3.1 vector对象的常见构造函数3.2 iterator的使用3.3 vector的空间管理3.4 vector的增删查改 4. vector迭代器失效的问题4.1 底层空间改变的操作4.2 指定位置元素的删除操作 5. vector模拟实现6. 结尾 1. 前言 上一篇文章我…

springboot3.0集成nacos2.2.1(一)

本章节内容是没有开启nacos校验方式进行接入 集成环境&#xff1a; java版本&#xff1a;JDK17 springboot版本&#xff1a;3.0.2 创建spring项目&#xff0c;我这里用到的是spring-cloud全家桶 首先是jar包依赖&#xff1a; <properties><maven.compiler.so…

【Linux】软件包管理器/编辑器/yum是应用商店?/vim编辑器什么?

本文思维导图&#xff1a; 文章目录 Linux软件安装关于Linux的软件生态 1.Linux软件包管理器&#xff1a;yum到底是什么关于yum指令&#xff1a;关于yum源 2. rzsz指令1. Linux编辑器——vim编辑器vim编辑器的三种主要模式vim编辑器命令模式常用快捷键&#xff1a;vim操作总结…

maven依赖选择策略(依赖调解)

这里先抛出结论 最短路径原则: 不同级依赖, 选择路径最短&#xff08;对于传递性依赖和一级依赖&#xff09;声明优先原则 : 同级依赖,先声明的覆盖后声明的&#xff08;对于传递性依赖&#xff09;同级依赖后加载覆盖先加载原则&#xff08;不属于传递性依赖的情况&#xff0…

spring(事务管理)

事物可以看做是由对数据库若干操作组成的一个单元 事务的作用就是为了保证用户的每一个操作都是可靠的&#xff0c;事务中的每一步操作都 必须成功执行&#xff0c;只要有发生异常就回退到事务开始未进行操作的状态,这些操作 要么都完成&#xff0c;要么都取消&#xff0c;从而…

7-10 算术入门之加减乘除

对于输入的两个整数&#xff0c;按照要求输出其和差积商。 输入格式: 在一行内输入两个不超过100的非负整数a和b&#xff0c;中间以一个空格间隔&#xff0c;且保证b不为0。 输出格式: 共四行&#xff0c;格式是&#xff1a; [a] [b] [ab] [a] - [b] [a-b] [a] * [b] [a…