У меня есть программа на языке C, вызывающая внешнюю команду с использованием system
, однако я не знаю, почему иногда нарушается внешняя программа, из-за которой вся программа выходит из строя, что я могу предотвратить сбой программы, даже если внешняя программа выйдет из строя?Как предотвратить сбой программы C, вызванный внешней программой
EDIT1: вот какой-то код, это часть большого проекта, как видно из кода, изначально они использовали 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);
}
Современные операционные системы изолируют процессы, так что один сбой напрямую не влияет на других. Может быть, ваша программа не реагирует должным образом на крушение другого? – rodrigo
Почему это приводит к сбою всей программы? 'system' не должен делать этого, он должен просто вернуться. Кроме того, как правило, не рекомендуется использовать 'system', вы обычно должны использовать одну из функций' exec'. Это поможет, если вы включите некоторый код и вывод в свой вопрос. – marinus
Не могли бы вы опубликовать фрагмент кода, чтобы другие могли вам помочь? – Ho1