Linux系统编程:目录操作、文件权限与库管理

Linux系统编程:目录操作、文件权限与库管理

目录的读取

在Linux系统编程中,目录操作是常见的任务之一。以下是用于目录操作的核心函数及其用法:

1. opendir

功能:打开一个目录,返回指向目录流的指针。
原型

#include 
DIR *opendir(const char *name);

参数

  • name:目录路径字符串。
    返回值
  • 成功:返回 DIR* 指针;失败返回 NULL

示例

DIR *dir = opendir("/home/user/documents");
if (dir == NULL) {
    perror("opendir failed");
}

2. fdopendir

功能:通过文件描述符打开目录流。
原型

#include 
DIR *fdopendir(int fd);

参数

  • fd:已打开的目录文件描述符。
    返回值
  • 成功:返回 DIR* 指针;失败返回 NULL

适用场景
当通过 open 获取目录文件描述符后,需转换为目录流进行读取时使用。


3. readdir

功能:逐个读取目录项。
原型

#include 
struct dirent *readdir(DIR *dirp);

参数

  • dirpopendir 返回的目录流指针。
    返回值
  • 成功:返回指向 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 
int closedir(DIR *dirp);

参数

  • dirp:已打开的目录流指针。
    返回值
  • 成功返回 0,失败返回 -1

文件权限管理

1. 修改文件权限

函数

  • chmod:通过路径修改权限。
  • fchmod:通过文件描述符修改权限。

原型

#include 
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 
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)。
  • 优点:无需运行时依赖;性能略高。
  • 缺点:体积大,更新需重新编译。

创建步骤

  1. 编译目标文件:
    gcc -c file1.c file2.c
    
  2. 打包为静态库:
    ar rcs libmylib.a file1.o file2.o
    

使用静态库

gcc -o app main.c -L. -lmylib

2. 动态库(Shared Library)

特点

  • 运行时加载,多个程序共享。
  • 文件扩展名:.so(Linux)、.dll(Windows)。
  • 优点:节省内存,便于更新。
  • 缺点:依赖环境配置。

创建步骤

  1. 编译为目标文件(位置无关代码):
    gcc -fPIC -c file1.c file2.c
    
  2. 生成动态库:
    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 动态库对比

特性 静态库 动态库
文件大小 较大 较小
内存占用 独立占用 共享节省内存
更新维护 需重新编译 替换库文件即可
运行时依赖 需配置环境变量
适用场景 独立分发、性能敏感场景 多程序共享、频繁更新

你可能感兴趣的:(linux,运维,服务器)