Linux系统编程:目录操作、文件权限与库管理
·
Linux系统编程:目录操作、文件权限与库管理
目录的读取
在Linux系统编程中,目录操作是常见的任务之一。以下是用于目录操作的核心函数及其用法:
1. opendir
功能:打开一个目录,返回指向目录流的指针。
原型:
#include <dirent.h>
DIR *opendir(const char *name);
参数:
name:目录路径字符串。
返回值:- 成功:返回
DIR*指针;失败返回NULL。
示例:
DIR *dir = opendir("/home/user/documents");
if (dir == NULL) {
perror("opendir failed");
}
2. fdopendir
功能:通过文件描述符打开目录流。
原型:
#include <dirent.h>
DIR *fdopendir(int fd);
参数:
fd:已打开的目录文件描述符。
返回值:- 成功:返回
DIR*指针;失败返回NULL。
适用场景:
当通过 open 获取目录文件描述符后,需转换为目录流进行读取时使用。
3. readdir
功能:逐个读取目录项。
原型:
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
参数:
dirp:opendir返回的目录流指针。
返回值:- 成功:返回指向
struct dirent的指针;目录末尾或失败时返回NULL。
struct dirent 结构:
struct dirent {
ino_t d_ino; // inode 号
off_t d_off; // 目录偏移量
unsigned short d_reclen; // 记录长度
unsigned char d_type; // 文件类型(如 DT_REG 为普通文件)
char d_name[256]; // 文件名
};
示例:
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("File: %s\n", entry->d_name);
}
4. closedir
功能:关闭目录流。
原型:
#include <dirent.h>
int closedir(DIR *dirp);
参数:
dirp:已打开的目录流指针。
返回值:- 成功返回
0,失败返回-1。
文件权限管理
1. 修改文件权限
函数:
chmod:通过路径修改权限。fchmod:通过文件描述符修改权限。
原型:
#include <sys/stat.h>
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);
参数:
path:文件路径。fd:文件描述符。mode:权限掩码(如0644)。
示例:
chmod("file.txt", S_IRUSR | S_IWUSR); // 用户可读可写
fchmod(fd, S_IRWXU); // 用户拥有全部权限
2. 获取文件属性
函数对比
| 函数 | 功能 | 是否解析符号链接 |
|---|---|---|
stat | 获取文件信息 | 是 |
lstat | 获取符号链接自身信息 | 否 |
fstat | 通过文件描述符获取信息 | - |
原型:
#include <sys/stat.h>
int stat(const char *path, struct stat *buf);
int lstat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
struct stat 核心字段:
struct stat {
mode_t st_mode; // 文件类型和权限
ino_t st_ino; // inode 号
uid_t st_uid; // 所有者用户 ID
gid_t st_gid; // 所有者组 ID
off_t st_size; // 文件大小(字节)
time_t st_mtime; // 最后修改时间
// 其他字段略
};
文件类型检测:
if (S_ISREG(st.st_mode)) {
printf("普通文件\n");
} else if (S_ISDIR(st.st_mode)) {
printf("目录\n");
}
权限检测:
if (st.st_mode & S_IRUSR) {
printf("用户可读\n");
}
静态库与动态库
1. 静态库(Static Library)
特点:
- 编译时直接嵌入可执行文件。
- 文件扩展名:
.a(Linux)、.lib(Windows)。 - 优点:无需运行时依赖;性能略高。
- 缺点:体积大,更新需重新编译。
创建步骤:
- 编译目标文件:
gcc -c file1.c file2.c - 打包为静态库:
ar rcs libmylib.a file1.o file2.o
使用静态库:
gcc -o app main.c -L. -lmylib
2. 动态库(Shared Library)
特点:
- 运行时加载,多个程序共享。
- 文件扩展名:
.so(Linux)、.dll(Windows)。 - 优点:节省内存,便于更新。
- 缺点:依赖环境配置。
创建步骤:
- 编译为目标文件(位置无关代码):
gcc -fPIC -c file1.c file2.c - 生成动态库:
gcc -shared -o libmylib.so file1.o file2.o
使用动态库:
gcc -o app main.c -L. -lmylib
# 运行时需确保库路径正确
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./app
3. 静态库 vs 动态库对比
| 特性 | 静态库 | 动态库 |
|---|---|---|
| 文件大小 | 较大 | 较小 |
| 内存占用 | 独立占用 | 共享节省内存 |
| 更新维护 | 需重新编译 | 替换库文件即可 |
| 运行时依赖 | 无 | 需配置环境变量 |
| 适用场景 | 独立分发、性能敏感场景 | 多程序共享、频繁更新 |
更多推荐



所有评论(0)