在 C 的回调函数中 fork() 安全吗?

hir*_*ari 2 c fork callback exec nftw

我正在概述一个计划。

基本上,我想使用 nftw 遍历目录树并执行任务(myexecutable)。

该函数 nftw 以 (fn) 作为参数,并将其用作回调函数。

现在,我计划在这个回调函数中使用经典的 fork-exec,我已经定义了该回调函数,以便通过将任务分配给不同文件的同一进程的多个实例来获得尽可能快的速度,从而几乎同时发生。

假设我想对每个文件执行操作 P。所以我定义我的回调函数如下:

static int fn(const char* pathname, const struct stat* st, int tf, struct FTW* ff){
    if(tf == FTW_F){
        if(fork() == 0){
            execl("myexecutable", "myexecutable", pathname, NULL);
            exit(0);
        }else{
            return 0;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不同的实例也不myexecutable以任何方式相互依赖或共享任何资源。并且它们不需要与父进程通信,反之亦然。

这会导致调用函数出现问题吗?

我是否应该期望 nftw 对此感到疯狂或表现出未定义的行为?

dbu*_*ush 7

这不会成为问题,因为您execl在新进程分叉后立即调用。所有进程内存,包括 nftw 可能具有的任何状态,都将替换为新程序的内存。

您应该做的唯一更改是调用_exit而不是exit在失败时调用execl。这样,它就不会调用任何atexit处理程序,并且可能会导致父进程中打开的文件描述符出现问题。