C分叉不退出

C分叉不退出,c,fork,C,Fork,我对C相当陌生,我编写了下面的代码,每10秒执行一次shell脚本(nsdc.sh)。出于某种原因,它多次调用shell脚本(在循环中)。似乎没有调用\u退出。有人能向我解释一下这种行为吗 #include "dynzone.h" void dynzone_run(struct nsd *nsd) { while(1) { pid_t pid = fork(); if(pid == -1) { log_msg(LOG_ERR,

我对C相当陌生,我编写了下面的代码,每10秒执行一次shell脚本(nsdc.sh)。出于某种原因,它多次调用shell脚本(在循环中)。似乎没有调用
\u退出
。有人能向我解释一下这种行为吗

#include "dynzone.h"

void
dynzone_run(struct nsd *nsd)
{
    while(1) {
        pid_t pid = fork();

        if(pid == -1) {
            log_msg(LOG_ERR, "fork zone reload failed");
        } else if(pid == 0) {
            /* CHILD */
            log_msg(LOG_NOTICE, "exec reload");

            if(system("/home/edns/jarno/v1/nsdc.sh reload") == -1) {
                printf("reload error: %s\n", strerror(errno));
            }

            _exit(1);
        }

        sleep(10);
    }
}

void
dynzone_spawn(struct nsd *nsd)
{
    pid_t pid;

    pid = fork();

    if(pid == -1) {
        log_msg(LOG_ERR, "fork dynzone failed");
    } else if(pid == 0) {
        /* CHILD */
        log_msg(LOG_NOTICE, "spawned dynzone");

        dynzone_run(nsd);

        /* ENOTREACH */
        exit(0);
    }

    /* PARENT */
    return;
}

提前谢谢

因此,在通常的推断和对您描述的所有方面的信任之后,可能只有一种可能的执行路径,这将导致您观察到的结果:

您的“nsdc.sh”脚本将永远不会退出


是吗?

这段代码似乎很好。你能给我们完整的图片吗?因为你有一个未使用的参数,所以有些代码似乎已经从函数中删除了。你还可以调试这个东西,看看这个脚本被称为gdb的地方和原因有能力做到这一点……或者它可能会被阻止,Holmes。在任何情况下,请检查脚本,OP>@Duck:完全正确!Jarno:请注意,“system()”只有在指定的命令执行后才会返回。所以请确保您的脚本将退出,而不仅仅是空闲。谢谢,我将进一步调查。但是,如果它仍然停留在nsdc.sh上而不退出,它仍然不应该滥发nsdc.sh的许多实例,对吗?@Jarno:由于“fork循环”,您的代码仍然会每10秒生成一个新的子实例……是的,但目前它正在循环中生成nsdc.sh实例,没有任何延迟(每秒数百个)。