2016-04-30 1 views
1

У меня есть программа на языке 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); 
} 
+2

Современные операционные системы изолируют процессы, так что один сбой напрямую не влияет на других. Может быть, ваша программа не реагирует должным образом на крушение другого? – rodrigo

+1

Почему это приводит к сбою всей программы? 'system' не должен делать этого, он должен просто вернуться. Кроме того, как правило, не рекомендуется использовать 'system', вы обычно должны использовать одну из функций' exec'. Это поможет, если вы включите некоторый код и вывод в свой вопрос. – marinus

+1

Не могли бы вы опубликовать фрагмент кода, чтобы другие могли вам помочь? – Ho1

ответ

2

При вызове другой программы через system(), новый процесс породил, а оболочка выполнена внутри него с помощью команд, которые вы даете.

Как правило, в большинстве операционных систем процесс сбоя дочернего процесса напрямую не разбивает родительский процесс.

Вероятно, ваш родительский процесс (который вызывает system()) имеет ошибку, которая позволяет ему сбой, когда дочерний процесс выходит из строя по какой-либо причине. Вам нужно отладить это.

Смежные вопросы