2016-04-30 7 views
1

私は外部プログラムをsystemで呼び出すCプログラムを持っていますが、外部プログラムが時折クラッシュする理由がわかりません。外部プログラムがクラッシュしてもプログラムのクラッシュを防ぐことができますか?外部プログラムによって引き起こされるCプログラムのクラッシュを防ぐ方法

EDIT1: ここにいくつかのコードがありますが、これは大きなプロジェクトの一部です。コードに見られるように、元々scpを使用してサーバーとの間でファイルを転送していましたが、 scpcontractとscpexpandという名前のscpの場合、関数に置き換えて、プログラム全体が時折クラッシュし始め、クラッシュの出力は "KEYERROR"というレポートであり、トレースバックはありません(印刷できません。理由は分かっていますが、カーネルリングのメッセージを見ると同時に「expand.so」というプログラムクラッシュがあることがわかりました。私はこの「expand.so」が何であるか分かりません。このファイルをプロジェクトに持ってください。あなたはsystem()を介して別のプログラムを呼び出す場合

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

現代のオペレーティングシステムはプロセスを分離するため、1つのクラッシュが他のプロセスに直接影響することはありません。他のプログラムのクラッシュに適切に反応しないプログラムですか? – rodrigo

+1

なぜプログラム全体がクラッシュするのですか? 'system'はそれをするべきではありません、それはちょうど返すべきです。また、一般的には 'system'を使うのは良い考えではありません。通常は' exec'関数の1つを代わりに使うべきです。それはあなたの質問にいくつかのコードと出力を含めると役立ちます。 – marinus

+1

コードスニペットを投稿して他の人があなたを助けることができますか? – Ho1

答えて

2

、新しいプロセスが起動され、そしてシェルはあなたが与えるコマンドでその中に実行されます。

通常、ほとんどのオペレーティングシステムでは、子プロセスがクラッシュしても親プロセスが直接クラッシュしません。

親プロセス(system()を呼び出す)には、何らかの理由で子プロセスが失敗したときにクラッシュする可能性のあるバグがある可能性があります。これをデバッグする必要があります。

関連する問題