google-code-prettify

2009-01-23

opensslのs_serverの不思議

以下のようなコードを書いた。これをopenssl.shとする。
#!/bin/sh

openssl s_server ...(省略)... &

bash上から、$ ./openssl.shとすると、バックグラウンドでopensslのs_serverが起動する。

NetBSD上で
$ ./openssl.sh
を実行すると、このs_serverにブラウザから接続できる。
しかし、Linux上で./openssl.shを実行すると、ブラウザから接続できない。

openssl.sh経由ではなく、以下のように直接opensslを実行すると、ブラウザから接続できる。
$ openssl s_server ... &


openssl.sh経由と直接の違いをktraceで調べてみた。

直接opensslを動作させると、
1. opensslがselectを呼ぶ
2. selectから抜ける。
3. ブラウザからの接続があり、通信を行う。
となるのだが、openssl.sh経由だと、
1. opensslがselectを呼ぶ
2. selectから抜ける。
3. fdの0(STDIN)が切られているので、プログラムを終了する。
と動作しているようだ。

なぜLinuxとNetBSDで動作が違うのかが不明。
bashの違い? opensslの違い?

動作が違う原因はわからないが、opensslのSTDINをcloseしてはいけないという事はわかった。
以下のようにする事で、回避する事にした。
1. openssl.shの中でopenssl s_serverを起動する時には、&を付けない。
#!/bin/sh

openssl s_server ...(省略)...

2. openssl.shを起動する時に、&を付ける。
$ openssl.sh &

0 件のコメント: