2016-01-19 18 views
7

UNIXドメインソケットを特定のパスに作成し、名前にbind()を付けたサーバーアプリケーションがあります。アプリケーションを終了するときにUNIXドメインソケットファイルを削除するにはどうすればよいですか?

アプリケーションコード内から意図的にアプリケーションを閉じる/停止するときにのみ、ソケットを削除する必要があります。さもなければそれは開いている必要があります。これはどうすればいいですか?

ありがとうございます!

編集:端末内からアプリケーションを起動して実行することを検討してください。

答えて

11

これは、必要以上に難しくしています。 unlink()bind()の直前に置きます。それが他の人たちのやり方です。 (例:古典的なunix-domain-socket-basedサービスのBSD syslogd

+0

ありがとうございます。私は縛られた後に行かなければならないと思った。それを指定してくれてありがとう。 – Pheonix7

+0

サーバが実行されていないときに古いソケットがディレクトリリストに表示されないようにするには、終了時にunlinkを実行することができます。しかしそれは純粋に化粧です。 –

1

あなたがプログラムを終了する前にちょうど

unlink("Path/to/Socket"); 

を実行します。

+0

私はターミナルから私のアプリケーションを終了するので、どこでコードにリンクを張りますか? – Pheonix7

0

あなたはシンプルなソケットファイルを削除することができます:あなたは、あなたのプログラムを終了し、それが存在するかどうかを確認し、それを削除するプログラムどこ

unlink(path); 

+0

しかし、私はターミナルから私のアプリケーションを終了するので、どこでコードにリンクを張るのですか? – Pheonix7

+0

あなたは 'Control-C'か何かを打っていると言っているのでなければ、どこからアプリケーションを終了するかは関係ありません。その場合、終了する前にソケットを処理するシグナルハンドラを作成する必要があります。 –

2

アプリケーションから複数の出口ポイントがあり、それらをそれぞれクリーンアップルーチンを呼び出すように変更したくない場合は、「ダーティー」アプローチを使用することができます。

ソケットが作成されたばかりで、atexit(3)でクリーンアップルーチンを登録します。アプリケーションが正常に終了すると、ルーチン(単にunlink(2)への呼び出し)が呼び出されます。しかし、アプリケーションがシグナルで終了した場合は呼び出されません。したがって、SIGINTや同様のシグナルを受け取った後でクリーンアップしたい場合は、シグナルハンドラも適切に設定する必要があります。

+0

okですが、ファイルはまだそこにあります。私はまた、フォルダ – Pheonix7

+0

@ Pheonix7からファイルを削除する必要があります、あなたはエラーのためのunlinkの終了コードをチェックしましたか? – gudok

+0

私はターミナルが何も言わないctr + cでアプリケーションを終了するとき。私はアプリケーションを再起動するとバインドエラーが発生します:使用中のアドレス – Pheonix7

関連する問題