如何防止外部程序导致C程序崩溃

如何防止外部程序导致C程序崩溃,c,C,我有一个C程序使用system调用一个外部命令,但是,我不知道为什么外部程序会偶尔崩溃,这会导致整个程序崩溃,即使外部程序崩溃,我还能防止我的程序崩溃吗 编辑1: 这是一些代码,这是一个大项目的一部分,从代码中可以看出,最初他们使用scp向服务器传输文件,由于一些限制,我编写了我们自己的scp版本,称为scpcontract和scpexpand,然后我将其替换为函数,然后整个程序开始偶尔崩溃,崩溃的输出是报告“KEYERROR”和无回溯(我无法打印它们,我不知道为什么),但当我查看内核环消息时,

我有一个C程序使用
system
调用一个外部命令,但是,我不知道为什么外部程序会偶尔崩溃,这会导致整个程序崩溃,即使外部程序崩溃,我还能防止我的程序崩溃吗

编辑1: 这是一些代码,这是一个大项目的一部分,从代码中可以看出,最初他们使用scp向服务器传输文件,由于一些限制,我编写了我们自己的scp版本,称为scpcontract和scpexpand,然后我将其替换为函数,然后整个程序开始偶尔崩溃,崩溃的输出是报告“KEYERROR”和无回溯(我无法打印它们,我不知道为什么),但当我查看内核环消息时,我看到有一个程序崩溃称为“expand.so”,同时,我不确定这个“expand.so”是什么,因为我在项目中没有这个文件

struct context {
    const char *path;
    const char *user_buf;
    int user_buf_size;
};


#define execute(fmt, ...) ({ \
    char buf[8196]; \
    snprintf(buf, 8173, fmt, ##__VA_ARGS__); \
    strcat(buf, ">/dev/null 2>/dev/null"); \
    system(buf); \
})



int contract(struct context *ctx) {
    int res = execute("scpcontract %s", ctx->path);
    return res;
}

int expand(struct context *ctx) {
    return execute("scpexpand %s", ctx->path);
}

当您通过
system()
调用另一个程序时,会生成一个新进程,并在其中使用您给出的命令执行一个shell

通常,在大多数操作系统上,子进程崩溃不会直接导致父进程崩溃


很可能您的父进程(调用
system()
)有一个bug,当子进程由于某种原因失败时,它会崩溃。您需要对此进行调试。

现代操作系统将进程隔离,以便一个进程崩溃不会直接影响其他进程。也许你的程序对另一个程序的崩溃没有做出正确的反应?为什么它会导致整个程序崩溃<代码>系统不应该这样做,它应该返回。另外,使用
system
通常不是一个好主意,您通常应该使用
exec
函数之一。如果您在问题中包含一些代码和输出,这会有所帮助。您可以发布一个代码片段,以便其他人可以帮助您吗?我在上面附加了一些代码,谢谢您的帮助!如果
ctx->path
的内容未正确初始化,可能会导致
snprintf()
崩溃或损坏程序。您可以尝试添加一个
printf(“路径=“%s”\n”,ctx->path)在系统调用之前。