【问题标题】:Scanning a directory and processing specific files simultaneously with fork in C在 C 中使用 fork 同时扫描目录并处理特定文件
【发布时间】:2026-01-01 06:30:01
【问题描述】:

我的目标是实现一个“ls”函数,以便我可以扫描指定目录并查找要处理的 .csv 文件。我现在的想法是每次使用 ls 函数检测到 csv 文件时使用 fork() 创建一个子进程,但我对如何执行此操作感到非常困惑。我已经阅读了 geeksforgeeks 上的 fork() 页面,如果每次检测到 csv 文件时都调用 fork,子进程会继续乘以 2?我是否必须将整个处理代码包装在 fork 语句中?如果我在创建另一个子进程之前等待每个子进程完成,那将不是多处理。我仍在学习 C,我发现很难掌握 fork 函数的实际工作原理。任何帮助将不胜感激,谢谢。

【问题讨论】:

  • fork调用创建的子进程不应该继续搜索目录,它应该处理文件然后exit。如果你稍微搜索一下,可能有数百万个关于如何使用fork 的例子在互联网上(包括 Stack Overflow)。
  • 为什么要为每个文件创建一个新进程?这是一种昂贵的方式来做你想做的任何事情。如果目的是使用fork() 锻炼你,那是一回事;如果你想做严肃的工作,那就完全是另一回事了。如果子进程 exec ls,那么不会有进程爆炸——它们不会每次都乘以 2。
  • 调用fork后,检查返回值。如果它返回 0 你在孩子中,你调用处理文件的函数并退出而不继续循环。如果它返回非零值,则您仍在父进程中,因此您继续扫描。

标签: c process fork ls


【解决方案1】:

基本结构应该是这样的:

while(d = readdir(fd) {
    if (iscsv(d->d_name)) {
        int pid = fork();
        switch(pid) {
        case 0: // Child process
            process_csv(d->d_name);
            exit(0);
            break;
        case -1: // Error
            perror("fork");
            exit(1);
            break;
        default: // Parent
            printf("Forked PID %d to process %s\n", pid, d->d_name);
    }
}

pid 的返回值用于区分你是在父节点还是子节点中继续。子进程处理文件并退出,父进程继续循环。所以你不要继续加倍进程(称为fork bomb),因为只有原始父进程会继续循环和分叉。

【讨论】:

  • 是否需要添加一个 wait() 系统调用以确保子进程在分叉另一个子进程之前完成运行,还是没有必要?
  • 如果您希望所有处理同时完成,则没有必要。这就是在子进程中执行此操作的原因,不是吗?
最近更新 更多