1

サーバー モードまたはクライアント モードで実行できる単一のバイナリがあります。次のように使用できます。

$ ./a.out --server &
$ ./a.out --client &

彼らはお互いに話し、これはうまくいっています。私の質問は、サーバーを起動したときに予想される動作は何ですか:

$ ./a.out --server &

しかし、その後、それを強制終了するのを忘れて、開発作業、編集、ビルド、およびクライアントの実行に取り掛かります。

$ edit client.c
$ make
$ ./a.out --client
^C
<repeat>

スティッキー ビットが設定されていない場合、私の OS (Ubuntu) は 2 つの異なるバージョンのバイナリを実行していますか? または、ショートカットを使用してメモリ内インスタンスを使用しているため、最新のビルドを無視していますか? この間違いに他の副作用はありますか?

4

2 に答える 2

2

make元のファイルを削除して実行可能ファイルを置き換えます。ただし、バックグラウンドで実行しているため、参照があります。参照がクリアされるまで、ファイルは完全には削除されません (ただし、新しい実行可能ファイルのために場所を空けるためにディレクトリ エントリはクリアされます)。

したがって、あなたの例では、実行中のプログラムの 2 つのバージョンがあります。副作用の 1 つは、パケット構造の変更など、サーバーとクライアントのコードで大きな非互換性を引き起こす変更を行った場合です。おそらく、奇妙で説明のつかない動作、クラッシュなどが見られるでしょう。バックグラウンド サーバーを強制終了して、テスト全体を再実行することを常にお勧めします。

于 2013-07-05T15:59:52.710 に答える
1

サーバー コードを変更しない場合は、a.out を 'my_server' にコピーするだけです。たとえば、それを my_server --server として実行します。make は a.out を置き換えますが、my_server は置き換えません。

別の方法 - 再コンパイルの直前に、実行中のすべての a.out-s を kill するように make に指示します: a.out に依存し、'killall a.out' を実行するターゲット 'all' を追加します (makefile の最初にある必要があります)。

于 2013-07-06T17:44:11.437 に答える