C语言文件与目录操作完全指南
2026/9/11 23:31:59 网站建设 项目流程

1. 文件与目录操作基础概念

文件系统是计算机存储和组织数据的基本方式,每个操作系统都有自己独特的文件管理机制。理解文件和目录的基本概念是进行任何高级操作的前提条件。

文件本质上就是存储在存储设备上的数据集合,它可以包含文本、图片、程序代码等各种信息。每个文件都有文件名和扩展名,比如"document.txt"中,"document"是文件名,".txt"是扩展名,表示这是一个文本文件。

目录(也称为文件夹)则是用来组织文件的容器,它可以包含文件和其他子目录,形成树状结构。在Windows系统中,目录路径使用反斜杠()分隔,如"C:\Users\Documents";而在Linux和macOS中则使用正斜杠(/),如"/home/user/documents"。

注意:不同操作系统对文件名的大小写敏感度不同。Windows通常不区分大小写,而Linux和macOS则区分大小写。

2. 常见文件操作详解

2.1 文件创建与删除

创建文件的方法多种多样,最简单的方式是通过程序代码实现。以C语言为例:

#include <stdio.h> int main() { FILE *fp; fp = fopen("example.txt", "w"); // 以写入模式创建文件 if(fp == NULL) { printf("文件创建失败\n"); return 1; } fclose(fp); return 0; }

删除文件同样简单,在C语言中可以使用remove()函数:

remove("example.txt");

在命令行环境中,不同系统有各自的删除命令:

  • Windows:del filename
  • Linux/macOS:rm filename

2.2 文件读写操作

文件读写是编程中最常见的操作之一。以下是C语言中基本的文件读写示例:

#include <stdio.h> int main() { // 写入文件 FILE *fp = fopen("data.txt", "w"); fprintf(fp, "这是一些文本数据\n"); fclose(fp); // 读取文件 char buffer[255]; fp = fopen("data.txt", "r"); while(fgets(buffer, 255, fp) != NULL) { printf("%s", buffer); } fclose(fp); return 0; }

提示:文件操作完成后一定要关闭文件,否则可能导致数据丢失或文件损坏。

2.3 文件复制与移动

文件复制可以通过编程实现,也可以使用系统命令。在C语言中,可以这样实现文件复制:

#include <stdio.h> int copyFile(const char *src, const char *dst) { FILE *srcFile = fopen(src, "rb"); FILE *dstFile = fopen(dst, "wb"); if(!srcFile || !dstFile) return -1; char buffer[1024]; size_t bytes; while((bytes = fread(buffer, 1, 1024, srcFile)) > 0) { fwrite(buffer, 1, bytes, dstFile); } fclose(srcFile); fclose(dstFile); return 0; }

系统命令方式:

  • Windows:copy source destination
  • Linux/macOS:cp source destination

文件移动实际上是重命名操作,在C语言中使用rename()函数:

rename("oldname.txt", "newname.txt");

系统命令:

  • Windows:move oldname newname
  • Linux/macOS:mv oldname newname

3. 目录操作全面解析

3.1 目录创建与删除

创建目录在编程中也很常见。C语言示例:

#include <sys/stat.h> #include <stdio.h> int main() { if(mkdir("new_directory", 0777) == -1) { perror("创建目录失败"); return 1; } return 0; }

删除空目录:

rmdir("empty_directory");

系统命令:

  • Windows创建:mkdir dirname
  • Linux/macOS创建:mkdir dirname
  • Windows删除:rmdir dirname(仅限空目录)
  • Linux/macOS删除:rmdir dirname(仅限空目录) 或rm -r dirname(递归删除)

3.2 目录遍历与内容列出

遍历目录内容是许多应用程序的基本需求。以下是C语言中使用dirent.h遍历目录的示例:

#include <dirent.h> #include <stdio.h> int main() { DIR *dir; struct dirent *entry; dir = opendir("."); if(dir == NULL) { perror("无法打开目录"); return 1; } while((entry = readdir(dir)) != NULL) { printf("%s\n", entry->d_name); } closedir(dir); return 0; }

系统命令列出目录内容:

  • Windows:dir
  • Linux/macOS:ls

3.3 目录切换与路径操作

在程序中切换工作目录可以使用chdir()函数:

#include <unistd.h> #include <stdio.h> int main() { if(chdir("/path/to/directory") == -1) { perror("切换目录失败"); return 1; } return 0; }

系统命令切换目录:

  • Windows:cd path
  • Linux/macOS:cd path

获取当前工作目录:

#include <unistd.h> #include <stdio.h> int main() { char cwd[1024]; if(getcwd(cwd, sizeof(cwd)) != NULL) { printf("当前工作目录: %s\n", cwd); } else { perror("获取当前目录失败"); return 1; } return 0; }

4. 高级文件与目录操作

4.1 文件属性与权限管理

文件属性包括大小、创建时间、修改时间、访问权限等。C语言中获取文件属性的示例:

#include <sys/stat.h> #include <stdio.h> #include <time.h> int main() { struct stat fileStat; if(stat("example.txt", &fileStat) == -1) { perror("获取文件状态失败"); return 1; } printf("文件大小: %lld 字节\n", fileStat.st_size); printf("最后修改时间: %s", ctime(&fileStat.st_mtime)); // 权限信息 printf("权限: "); printf((S_ISDIR(fileStat.st_mode)) ? "d" : "-"); printf((fileStat.st_mode & S_IRUSR) ? "r" : "-"); printf((fileStat.st_mode & S_IWUSR) ? "w" : "-"); printf((fileStat.st_mode & S_IXUSR) ? "x" : "-"); printf("\n"); return 0; }

修改文件权限(Linux/macOS):

chmod("example.txt", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);

系统命令:

  • Linux/macOS:chmod 644 filename

4.2 文件锁定与并发控制

在多进程/多线程环境中,文件锁定非常重要。以下是文件锁定的示例:

#include <sys/file.h> #include <stdio.h> #include <fcntl.h> #include <unistd.h> int main() { int fd = open("example.txt", O_RDWR); if(fd == -1) { perror("打开文件失败"); return 1; } // 获取独占锁 if(flock(fd, LOCK_EX) == -1) { perror("文件锁定失败"); close(fd); return 1; } // 执行需要独占访问的操作 printf("文件已锁定,执行操作...\n"); sleep(5); // 模拟操作 // 释放锁 flock(fd, LOCK_UN); close(fd); return 0; }

4.3 特殊文件处理

4.3.1 处理MSI文件

MSI文件是Windows安装程序包。虽然不建议直接操作MSI文件内容,但可以通过以下方式安装:

Windows命令提示符:

msiexec /i package.msi
4.3.2 处理ISO镜像文件

ISO文件是光盘映像,可以挂载或提取内容:

Linux挂载ISO:

mkdir /mnt/iso mount -o loop image.iso /mnt/iso

Windows 10及以上版本可以直接双击挂载ISO文件。

4.3.3 处理DLL文件

DLL(动态链接库)文件是Windows共享库。如果遇到DLL文件丢失错误,可以:

  1. 重新安装相关程序
  2. 从可信来源下载缺失的DLL文件并放入系统目录(谨慎操作)
  3. 使用系统文件检查器(Windows):
sfc /scannow

5. 跨平台文件操作注意事项

5.1 路径分隔符处理

编写跨平台程序时,路径分隔符是一个常见问题。以下是处理方式:

#include <stdio.h> #ifdef _WIN32 #define PATH_SEPARATOR '\\' #else #define PATH_SEPARATOR '/' #endif void join_path(char *result, const char *dir, const char *file) { sprintf(result, "%s%c%s", dir, PATH_SEPARATOR, file); } int main() { char fullpath[1024]; join_path(fullpath, "path", "to"); join_path(fullpath, fullpath, "file.txt"); printf("完整路径: %s\n", fullpath); return 0; }

5.2 文件权限差异

Windows和Unix-like系统(Linux/macOS)的文件权限模型不同:

  • Windows主要依赖ACL(访问控制列表)
  • Unix-like系统使用简单的用户/组/其他权限位

编写跨平台代码时,应使用各自系统的API或使用跨平台库如Boost.Filesystem。

5.3 文件名编码问题

不同系统可能使用不同的字符编码存储文件名。现代系统通常使用UTF-8(Linux/macOS)或UTF-16(Windows),但旧系统可能使用本地编码。

处理建议:

  • 在Windows上使用宽字符API(如_wfopen)
  • 在Linux/macOS上确保使用UTF-8
  • 考虑使用跨平台库如ICU处理编码转换

6. 文件与目录操作实战技巧

6.1 高效文件搜索实现

实现一个简单的递归文件搜索功能:

#include <stdio.h> #include <dirent.h> #include <string.h> #include <sys/stat.h> void search_files(const char *dirpath, const char *pattern) { DIR *dir; struct dirent *entry; struct stat statbuf; char path[1024]; if((dir = opendir(dirpath)) == NULL) { perror("无法打开目录"); return; } while((entry = readdir(dir)) != NULL) { if(strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue; snprintf(path, sizeof(path), "%s/%s", dirpath, entry->d_name); if(stat(path, &statbuf) == -1) { perror("获取文件状态失败"); continue; } if(S_ISDIR(statbuf.st_mode)) { search_files(path, pattern); } else if(strstr(entry->d_name, pattern) != NULL) { printf("找到文件: %s\n", path); } } closedir(dir); } int main() { search_files(".", ".txt"); return 0; }

6.2 大文件处理优化

处理大文件时需要特别注意内存使用:

  1. 使用缓冲读写而非一次性加载整个文件
  2. 考虑使用内存映射文件(mmap)提高性能
  3. 分块处理大文件

内存映射文件示例(Linux/macOS):

#include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> int main() { int fd = open("largefile.bin", O_RDONLY); if(fd == -1) { perror("打开文件失败"); return 1; } struct stat sb; if(fstat(fd, &sb) == -1) { perror("获取文件大小失败"); close(fd); return 1; } void *addr = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0); if(addr == MAP_FAILED) { perror("内存映射失败"); close(fd); return 1; } // 使用映射的内存区域 printf("文件前16字节: "); for(int i = 0; i < 16 && i < sb.st_size; i++) { printf("%02x ", ((unsigned char *)addr)[i]); } printf("\n"); munmap(addr, sb.st_size); close(fd); return 0; }

6.3 文件监控与变更检测

许多应用需要监控文件变更。以下是使用inotify的Linux示例:

#include <sys/inotify.h> #include <stdio.h> #include <unistd.h> #include <limits.h> #define EVENT_SIZE (sizeof(struct inotify_event)) #define BUF_LEN (1024 * (EVENT_SIZE + NAME_MAX + 1)) int main() { int fd = inotify_init(); if(fd == -1) { perror("inotify初始化失败"); return 1; } int wd = inotify_add_watch(fd, ".", IN_MODIFY | IN_CREATE | IN_DELETE); if(wd == -1) { perror("无法添加监控"); close(fd); return 1; } printf("监控当前目录变更...\n"); char buffer[BUF_LEN]; while(1) { ssize_t len = read(fd, buffer, BUF_LEN); if(len == -1) { perror("读取事件失败"); break; } for(char *ptr = buffer; ptr < buffer + len; ) { struct inotify_event *event = (struct inotify_event *)ptr; if(event->mask & IN_CREATE) { printf("文件创建: %s\n", event->name); } else if(event->mask & IN_DELETE) { printf("文件删除: %s\n", event->name); } else if(event->mask & IN_MODIFY) { printf("文件修改: %s\n", event->name); } ptr += EVENT_SIZE + event->len; } } inotify_rm_watch(fd, wd); close(fd); return 0; }

Windows上有类似的ReadDirectoryChangesW API可以实现类似功能。

7. 常见问题与解决方案

7.1 文件操作常见错误处理

文件操作中常见的错误及处理方法:

  1. 文件不存在错误

    • 检查文件路径是否正确
    • 使用access()函数检查文件是否存在
    • 提供友好的错误信息
  2. 权限不足错误

    • 检查文件权限
    • 尝试以管理员/root权限运行程序
    • 提供明确的权限需求说明
  3. 磁盘空间不足

    • 检查可用磁盘空间
    • 提供清理建议或替代存储位置
  4. 文件锁定冲突

    • 检查是否有其他进程正在使用文件
    • 实现重试机制
    • 提供明确的错误信息

错误处理示例:

#include <stdio.h> #include <errno.h> #include <string.h> int main() { FILE *fp = fopen("nonexistent.txt", "r"); if(fp == NULL) { printf("错误代码: %d\n", errno); printf("错误信息: %s\n", strerror(errno)); if(errno == ENOENT) { printf("文件不存在\n"); } else if(errno == EACCES) { printf("权限不足\n"); } return 1; } fclose(fp); return 0; }

7.2 目录操作常见陷阱

  1. 递归删除目录的危险性

    • 实现递归删除时要格外小心
    • 可以先打印将要删除的内容,确认后再执行
    • 考虑使用系统命令如rm -rf(谨慎使用)
  2. 符号链接导致的循环

    • 处理目录时要检查符号链接
    • 可以使用lstat()而非stat()检测符号链接
  3. 路径遍历漏洞

    • 检查用户提供的路径是否包含".."
    • 使用realpath()解析完整路径
    • 限制操作范围

安全目录遍历示例:

#include <limits.h> #include <stdlib.h> #include <stdio.h> int is_safe_path(const char *user_path, const char *base_dir) { char resolved_path[PATH_MAX]; char resolved_base[PATH_MAX]; if(realpath(user_path, resolved_path) == NULL) return 0; if(realpath(base_dir, resolved_base) == NULL) return 0; // 检查用户路径是否在基础目录下 size_t base_len = strlen(resolved_base); return strncmp(resolved_path, resolved_base, base_len) == 0; } int main() { const char *base_dir = "/safe/directory"; const char *user_path = "../secret"; if(!is_safe_path(user_path, base_dir)) { printf("路径不安全: %s\n", user_path); return 1; } printf("路径安全,继续操作\n"); return 0; }

7.3 性能优化建议

  1. 减少文件打开/关闭操作

    • 批量处理文件时保持文件打开
    • 但要注意文件描述符限制
  2. 使用缓冲IO

    • 默认的stdio函数已经缓冲
    • 自定义缓冲区可以进一步提高性能
  3. 异步IO

    • 对于高并发应用,考虑使用异步IO
    • Linux上有io_uring,Windows上有IOCP
  4. 目录遍历优化

    • 避免重复遍历同一目录
    • 考虑缓存目录内容
  5. 文件系统特性利用

    • 了解所用文件系统的特性(如ext4、NTFS等)
    • 根据特性优化文件布局和访问模式

8. 现代文件系统API与库

8.1 C++17文件系统库

C++17引入了 标准库,大大简化了文件操作:

#include <filesystem> #include <iostream> namespace fs = std::filesystem; int main() { // 创建目录 fs::create_directory("test_dir"); // 复制文件 fs::copy("source.txt", "test_dir/destination.txt"); // 遍历目录 for(const auto &entry : fs::directory_iterator(".")) { std::cout << entry.path() << std::endl; } // 获取文件大小 std::cout << "文件大小: " << fs::file_size("source.txt") << " 字节\n"; // 删除文件 fs::remove("test_dir/destination.txt"); return 0; }

8.2 Python文件操作

Python的os和shutil模块提供了高级文件操作接口:

import os import shutil # 创建目录 os.mkdir("new_dir") # 复制文件 shutil.copy2("source.txt", "new_dir/destination.txt") # 遍历目录 for root, dirs, files in os.walk("."): for file in files: print(os.path.join(root, file)) # 获取文件信息 stat = os.stat("source.txt") print(f"文件大小: {stat.st_size} 字节") print(f"最后修改时间: {stat.st_mtime}") # 删除文件 os.remove("new_dir/destination.txt")

8.3 Java NIO.2文件操作

Java 7引入了NIO.2 API,提供了更强大的文件系统支持:

import java.nio.file.*; import java.io.IOException; public class FileOperations { public static void main(String[] args) { Path dir = Paths.get("test_dir"); try { // 创建目录 Files.createDirectory(dir); // 复制文件 Path source = Paths.get("source.txt"); Path destination = dir.resolve("destination.txt"); Files.copy(source, destination); // 遍历目录 Files.walk(dir) .forEach(System.out::println); // 获取文件属性 System.out.println("文件大小: " + Files.size(destination) + " 字节"); // 删除文件 Files.delete(destination); } catch (IOException e) { e.printStackTrace(); } } }

9. 文件与目录操作的最佳实践

9.1 安全实践

  1. 验证所有输入路径

    • 检查路径是否包含恶意字符或序列
    • 限制操作范围
  2. 正确处理文件权限

    • 遵循最小权限原则
    • 创建文件时设置适当的权限
  3. 处理符号链接

    • 明确决定是否跟随符号链接
    • 使用lstat()而非stat()检测符号链接
  4. 原子性操作

    • 重要操作应尽可能原子化
    • 使用rename()而非先删除后创建

9.2 可移植性实践

  1. 使用跨平台库

    • 如Boost.Filesystem、Qt QFile等
    • 或使用高级语言如Python、Java
  2. 处理路径分隔符

    • 使用库函数连接路径
    • 避免硬编码分隔符
  3. 处理文件名编码

    • 明确文档要求的编码
    • 在Windows上考虑宽字符API
  4. 考虑文件系统差异

    • 不同文件系统有不同的特性限制
    • 如文件名长度、大小写敏感度等

9.3 性能实践

  1. 批量操作

    • 减少文件打开/关闭次数
    • 批量读取/写入数据
  2. 适当缓冲

    • 使用缓冲IO
    • 调整缓冲区大小以适应场景
  3. 异步IO

    • 对于高吞吐量应用
    • 利用现代异步IO接口
  4. 缓存元数据

    • 避免重复查询文件属性
    • 但要注意缓存一致性

10. 实际应用案例分析

10.1 实现一个简单的文件管理器

以下是一个简单的命令行文件管理器核心功能实现:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include <sys/stat.h> #include <unistd.h> void list_directory(const char *path) { DIR *dir; struct dirent *entry; struct stat statbuf; if((dir = opendir(path)) == NULL) { perror("无法打开目录"); return; } printf("%s:\n", path); while((entry = readdir(dir)) != NULL) { if(strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue; char fullpath[1024]; snprintf(fullpath, sizeof(fullpath), "%s/%s", path, entry->d_name); if(stat(fullpath, &statbuf) == -1) { perror("获取文件信息失败"); continue; } printf("%c %10lld %s\n", S_ISDIR(statbuf.st_mode) ? 'd' : '-', statbuf.st_size, entry->d_name); } closedir(dir); } void copy_file(const char *src, const char *dst) { FILE *srcFile = fopen(src, "rb"); FILE *dstFile = fopen(dst, "wb"); if(!srcFile || !dstFile) { perror("文件操作失败"); if(srcFile) fclose(srcFile); if(dstFile) fclose(dstFile); return; } char buffer[4096]; size_t bytes; while((bytes = fread(buffer, 1, sizeof(buffer), srcFile)) > 0) { if(fwrite(buffer, 1, bytes, dstFile) != bytes) { perror("写入失败"); break; } } fclose(srcFile); fclose(dstFile); } int main() { char command[256]; char arg1[256]; char arg2[256]; while(1) { printf("\n> "); if(fgets(command, sizeof(command), stdin) == NULL) break; if(sscanf(command, "ls %255s", arg1) == 1) { list_directory(arg1); } else if(sscanf(command, "cp %255s %255s", arg1, arg2) == 2) { copy_file(arg1, arg2); } else if(strncmp(command, "exit", 4) == 0) { break; } else { printf("可用命令:\n"); printf("ls <目录> - 列出目录内容\n"); printf("cp <源文件> <目标文件> - 复制文件\n"); printf("exit - 退出程序\n"); } } return 0; }

10.2 实现文件变更监控服务

以下是一个简单的文件监控服务实现,基于Linux的inotify:

#include <sys/inotify.h> #include <stdio.h> #include <unistd.h> #include <limits.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <time.h> #define EVENT_SIZE (sizeof(struct inotify_event)) #define BUF_LEN (1024 * (EVENT_SIZE + NAME_MAX + 1)) volatile sig_atomic_t stop = 0; void handle_signal(int sig) { stop = 1; } void log_event(const char *message) { time_t now; time(&now); printf("[%.24s] %s\n", ctime(&now), message); } int main(int argc, char **argv) { if(argc < 2) { fprintf(stderr, "用法: %s <目录> [目录...]\n", argv[0]); return 1; } signal(SIGINT, handle_signal); signal(SIGTERM, handle_signal); int fd = inotify_init(); if(fd == -1) { perror("inotify初始化失败"); return 1; } int *wd = malloc((argc - 1) * sizeof(int)); if(wd == NULL) { perror("内存分配失败"); close(fd); return 1; } for(int i = 1; i < argc; i++) { wd[i-1] = inotify_add_watch(fd, argv[i], IN_MODIFY | IN_CREATE | IN_DELETE | IN_MOVED_FROM | IN_MOVED_TO); if(wd[i-1] == -1) { fprintf(stderr, "无法监控目录: %s\n", argv[i]); } else { log_event("开始监控目录"); printf("监控目录: %s\n", argv[i]); } } char buffer[BUF_LEN]; while(!stop) { fd_set fds; FD_ZERO(&fds); FD_SET(fd, &fds); struct timeval timeout = {.tv_sec = 1, .tv_usec = 0}; int ret = select(fd + 1, &fds, NULL, NULL, &timeout); if(ret == -1) { perror("select错误"); break; } else if(ret == 0) { continue; // 超时,检查停止标志 } ssize_t len = read(fd, buffer, BUF_LEN); if(len == -1) { perror("读取事件失败"); break; } for(char *ptr = buffer; ptr < buffer + len; ) { struct inotify_event *event = (struct inotify_event *)ptr; char message[256]; if(event->mask & IN_CREATE) { snprintf(message, sizeof(message), "创建: %s/%s", argv[event->wd], event->name); log_event(message); } else if(event->mask & IN_DELETE) { snprintf(message, sizeof(message), "删除: %s/%s", argv[event->wd], event->name); log_event(message); } else if(event->mask & IN_MODIFY) { snprintf(message, sizeof(message), "修改: %s/%s", argv[event->wd], event->name); log_event(message); } else if(event->mask & IN_MOVED_FROM) { snprintf(message, sizeof(message), "移动/重命名: %s/%s", argv[event->wd], event->name); log_event(message); } else if(event->mask & IN_MOVED_TO) { snprintf(message, sizeof(message), "移动/重命名到: %s/%s", argv[event->wd], event->name); log_event(message); } ptr += EVENT_SIZE + event->len; } } log_event("停止监控服务"); for(int i = 1; i < argc; i++) { if(wd[i-1] != -1) { inotify_rm_watch(fd, wd[i-1]); } } free(wd); close(fd); return 0; }

10.3 实现多线程文件搜索工具

以下是一个多线程文件搜索工具的实现:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include <sys/stat.h> #include <pthread.h> #include <unistd.h> #define MAX_THREADS 4 #define MAX_QUEUE_SIZE 100 typedef struct { char path[PATH_MAX]; char pattern[256]; } Task; typedef struct { Task queue[MAX_QUEUE_SIZE]; int front; int rear; int count; pthread_mutex_t lock; pthread_cond_t not_empty; pthread_cond_t not_full; } TaskQueue; typedef struct { int id; TaskQueue *queue; int *found; pthread_mutex_t *found_lock; } ThreadData; void task_queue_init(TaskQueue *q) { q->front = 0; q->rear = 0; q->count = 0; pthread_mutex_init(&q->lock, NULL); pthread_cond_init(&q->not_empty, NULL); pthread_cond_init(&q->not_full, NULL); } void task_queue_enqueue(TaskQueue *q, Task task) { pthread_mutex_lock(&q->lock); while(q->count >= MAX_QUEUE_SIZE) { pthread_cond_wait(&q->not_full, &q->lock); } q->queue[q->rear] = task; q->rear = (q->rear + 1) % MAX_QUEUE_SIZE; q->count++; pthread_cond_signal(&q->not_empty); pthread_mutex_unlock(&q->lock); } Task task_queue_dequeue(TaskQueue *q) { pthread_mutex_lock(&q->lock); while(q->count <= 0) { pthread_cond_wait(&q->not_empty, &q->lock); } Task task = q->queue[q->front]; q->front = (q->front + 1) % MAX_QUEUE_SIZE; q->count--; pthread_cond_signal(&q->not_full); pthread_mutex_unlock(&q->lock); return task; } void *search_thread(void *arg) { ThreadData *data = (ThreadData *)arg; TaskQueue *queue =>

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询