文章目录
- 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 发行版:
- Ubuntu:由 Canonical 公司开发和维护的基于 Debian 的 Linux 发行版,以易用性和稳定性著称,广泛应用于桌面、服务器和云平台等场景。
- Red Hat Enterprise Linux:由 Red Hat 公司开发和维护的商业 Linux 发行版,主要用于企业级服务器和工作站,提供高可靠性和安全性。
- Fedora:由社区驱动的 Linux 发行版,由 Red Hat 公司支持,以最新的软件包和技术为特点。
- CentOS:由社区维护的免费 Linux 发行版,以稳定性和安全性闻名,主要用于企业级服务器和工作站。
- Debian:由社区开发和维护的免费 Linux 发行版,以稳定性和可靠性著称,广泛应用于服务器和桌面环境。
- Arch Linux:由社区维护的适合高级用户的 Linux 发行版,具有高度的灵活性和可定制性,提供了最新的软件包和最新的功能。
此外,还有很多其他的 Linux 发行版,它们都根据特定的需求或目标进行优化和定制,如 Kali Linux 用于网络安全、Raspbian 用于树莓派等。
linux使用
使用范围
Linux 是一种功能强大、灵活并且免费的操作系统,可以应用于各种场景和用途。以下是 Linux 的一些常见使用场景:
- 服务器:Linux 在服务器领域得到了广泛应用,因为它具有高可靠性、安全性和稳定性。许多互联网公司、数据中心和云计算服务提供商都在使用 Linux 系统。
- 桌面:Linux 可以作为桌面操作系统来使用,提供和其他桌面操作系统相同的功能和应用。这些桌面环境包括 GNOME、KDE Plasma、Cinnamon 等。
- 移动设备:Android 是基于 Linux 内核构建的移动操作系统,广泛应用于智能手机、平板电脑等移动设备上。
- 嵌入式系统:Linux 还被广泛用于嵌入式设备的控制系统、网络设备等方面。
- 开发平台: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 中,可以使用两种方式来修改文件或目录的权限:文字设定法和数字设定法。
文字设定法是指通过符号来表示权限。具体地说,可以使用 u
、g
和 o
分别表示用户、组和其他人,并且可以用 +
、-
和 =
来分别表示添加、删除和设置权限。例如:
# 将 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中有一些特殊的目录,如下:
- /:根目录,所有的文件和目录都是从这里开始。
- /bin:存放系统命令(binary)的目录。
- /sbin:存放系统管理员使用的命令(system binary)。
- /etc:存放系统配置文件(configuration)的目录。
- /dev:存放设备文件(device)的目录。
- /proc:存放进程信息(process)的目录。
- /var:存放系统运行时需要变化的文件(variable)的目录。
- /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 语言标准库中的函数来管理和操作文件目录。以下是一些常见的函数及其参数:
-
opendir()
函数:DIR *opendir(const char *name);
参数:
name
:要打开的目录的路径名。
返回值:
- 如果打开目录成功,则返回一个指向
DIR
类型结构体的指针。 - 如果出错,则返回 NULL,并设置相应的错误码(通过
errno
变量获取)。
-
readdir()
函数:struct dirent *readdir(DIR *dirp);
参数:
dirp
:先前由opendir()
打开的目录指针。
返回值:
- 如果读取下一个目录项成功,则返回一个指向
dirent
类型结构体的指针。 - 如果已到达目录末尾或出现错误,则返回 NULL,并设置相应的错误码(通过
errno
变量获取)。
-
closedir()
函数:int closedir(DIR *dirp);
参数:
dirp
:先前由opendir()
打开的目录指针。
返回值:
- 如果成功关闭目录,则返回 0。
- 如果出错,则返回 -1,并设置相应的错误码(通过
errno
变量获取)。
-
mkdir()
函数:int mkdir(const char *path, mode_t mode);
参数:
path
:要创建的目录路径名。mode
:新目录的权限和属性。可以使用chmod()
函数修改它。
返回值:
- 如果成功创建目录,则返回 0。
- 如果出错,则返回 -1,并设置相应的错误码(通过
errno
变量获取)。
-
rmdir()
函数:int rmdir(const char *pathname);
参数:
pathname
:要删除的目录路径名。
返回值:
- 如果成功删除目录,则返回 0。
- 如果出错,则返回 -1,并设置相应的错误码(通过
errno
变量获取)。
-
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;
}