c - 如何防止外部程序引起的C程序崩溃

标签 c

我有一个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())可能有一个错误,当子进程因某种原因失败时,它会崩溃。您需要对此进行调试。

关于c - 如何防止外部程序引起的C程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36955324/

相关文章:

c - 在 C 的自定义 shell 中执行重定向( ">"和 "<")

c - 在 C 本地范围内使用 static 关键字来运行

c++ - 从 C 中的多个线程访问静态常量变量

c++ - 如何用单向链表实现一个队列,使其 ENQUEUE 和 DEQUEUE 的时间复杂度为 O(1)?

CLion "Expression can be simplified"按位运算消息

c - 如何从内核中获取总物理内存

我可以在同一个文件中使用来自 time.h 的两个 tm 结构吗?

c - 如何将 2^63 添加到带符号的 64 位整数并将其转换为无符号的 64 位整数而不在中间使用 128 位整数

c - 成员为指针的结构数组

c - 无效的初始化程序 : While assigning value from struct to a struct array