2010-11-21 13 views
1

現在Linux TCP/IPサーバーで作業しています。サーバープログラムはCで動作していますが、現在はテストしていますが、Ctrl-cで終了するたびに、使用しているポートは解放されず、ロックされていないデータベースもありません。 Ctrl + C信号が受信されたときに終了するサブルーチンをどのように定義しますか?C言語で書かれたLinux TCP/IPサーバーでのCtrl-Cの処理

+0

CTRL + Zで試しましたか? –

+2

ctrl + zはプロセスを終了せず、単に停止します。 – jtdubs

答えて

1

つのオプション:Rが指摘したようにsighandler_t signal(int signum, sighandler_t handler);

は、sigactionsignalよりも移植され、おそらく:とint atexit(void (*function)(void));

  • フックはCtrl + C:

    1. がでクリーンアップルーチンを追加します。 Linuxではあまり慣れない。

      警告:あなたのプログラムがSIGKILL(Ctrl + /)で殺されたり、他の未処理のシグナルが受信された場合、atexitルーチンは実行されません。

  • +0

    これは問題ではないと思います。ソケットの問題に関しては –

    +1

    、私はあなたの答えに同意します。しかし、データベース接続で... – jtdubs

    +0

    ああ、私は質問の後半を読むにはあまりにも怠惰でした。私はデータベースについて同意します。そして、それは 'atexit'ではなく、必要なシグナルハンドラです。 'atexit'で登録された関数は、処理されていないシグナルからプロセスが消滅したときには実行されません。 –

    1

    ルックアップsetsockoptおよびSO_REUSEADDR。このオプションは、古い元のサーバープロセスのソケットに設定されている必要があります。新しいサーバーは、TIME_WAITの期限が切れるまでポートをバインドできません。

    1

    @Bortds一般的に、ポートはすぐに解放されませんので、しばらくお待ちください。私は働いたサーバープロジェクトからこれを見つけました。

    +0

    @everybody Rさんの答えは私の答えの大集合です。 – prabhakaran

    関連する問題