5

こんにちは私はCで書かれたプログラムを持っています。私はグローバル変数、配列、動的変数、そして配列なども持っています...私はSIGHUPをプログラムに送信し、ハンドラーで動的メモリをクリーンアップします。そしてHUPでプログラムを再起動したいと思います。 .cでプログラムを再起動する方法はありますか?mainの静的配列によって処理されるメモリをクリーンアップしてmainを再起動するために、mainを終了して戻りたいと思います。

また会ったね。シグナルハンドラーを編集し、ハンドラーにexecvを追加しました。ハンドラーには2つの関数があります。最初はclean_up();です。これは動的配列をクリーンアップし、2番目はexecv()です。HUPを送信した後、最初にclean_upが実行され、次にexecvが実行されます。しかし、しばらくすると、セグメンテーション違反が発生します。しかし、clean_up funcを呼び出さない場合は、正常に動作しますか?クリーンアップに問題がありますか?ただし、クリーンアップは他の信号、たとえば終了信号では正常に機能します

そして、execvへの質問?。メインから新しいプログラムを開始しませんか?。execvを呼び出すと、メインから再開されません。

4

2 に答える 2

8

あなたはLinuxを使用しているので、これが最もクリーンな方法だと思います。

int main(int argc, char **argv) {
    /* your program here */

    /* if you want to restart call this */
    if (execv(argv[0], argv)) {
        /* ERROR, handle this yourself */
    }

    return 0;
}
于 2012-04-18T09:13:01.157 に答える
1

なんらかの形式のUNIXを使用していると思います。ここに同様の質問に対する答えがあります。そのコードは、実際の再起動ではなく、ため息をついたときに人々が期待する設定ファイルを再読み込みしているだけです。ただし、再起動する場合は、load_config()呼び出しをexecに置き換えるだけです。選択できるexec呼び出しがいくつかあるので、execまたはexecveのマンページを見て、必要なものを選択してください。実行時にそれらを保持するために、親プロセスから環境とargvポインターを渡します。

どんなに価値があるとしても、プログラムを再起動しておそらく再初期化するだけの場合に、静的配列をクリーンアップする理由がわかりません。

于 2012-04-18T09:17:48.273 に答える