- PR -

perlでFTP_PUTを作っていますが!(エラー通知)

1
投稿者投稿内容
NM
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 93
投稿日時: 2004-08-06 17:49
ActivePerl 5.2.2をwindows2000から使っています。

perlは初心者ですが今、本やNETを検索しftpの機能を作っています。

perlで作ったプログラムをコマンドプロンプトから起動しています。

PUTコマンドの処理で送信エラー、サイズチェックなどを行い、エラーがあればメイン処理にリターンコードを返しています。

use Socket;
use FileHandle;

my $CmnRetCd;

省略(認証関連等)

$RetCd=&cmd_put($comd, $cmd, 4, $SendSizeChk, $SendFileSz, @opt);
$CmnRetCd=$RetCd;
省略
&ftp_send($comd, 'QUIT');
&ftp_recv($comd);
&ftp_close($comd);
print "****RETRUN CODE --> $CmnRetCd\n";
exit $CmnRetCd;

今、エラーが発生すると、次の様にエラーコード4を返していて、終了処理を実施しているのですが、呼出した処理(systemでこの処理を起動した親処理)にエラーを通知するためにexitを掛けると「221」の後、エラーコードが0に成ってしまいます。また、エラーコードを通知するPUTコマンドの処理も一回しか通っていませんし、print "****RETRUN CODE --> $CmnRetCd\n";もexit $CmnRetCd;も一箇所しか無いのですがエラー4が0になって2回動いているので上位には0の正常しか伝わりません。

---> SYST
215 Windows_NT version 5.0
---> CWD hachuout
250 CWD command successful.
---> TYPE I
200 Type set to I.
---> PASV
227 Entering Passive Mode (192,168,0,20,19,137).
---> STOR aaaa.dat
sub cmd_put start
125 Data connection already open; Transfer starting.
---> QUIT
226 Transfer complete.
****RETRUN CODE --> 4
221
---> QUIT
****RETRUN CODE --> 0

221はGOODBYEの様ですが221しか出ていませんし、何処に注意すれば良いのでしょうか?

未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2004-08-06 21:59
> 呼出した処理(systemでこの処理を起動した親処理)にエラーを通知するために
> exitを掛けると
この部分の解釈がビミョーなので、外していたらすいません。

perlプロセスをexitコマンドで終了させると変数もクリアされてしまいます。
ですので、終了前に一時ファイルにエラー内容を保存するか、Subなどで呼び出している場合は
return $errorCode;
などでエラー値を返してサブルーチンを抜けるようにする必要があると思います。


[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2004-08-06 22:00 ]
NM
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 93
投稿日時: 2004-08-07 21:05
有難う御座います。

何せPERLを良く判らないまま使っているので、グローバル/my/localの関係で値が渡らないのかだとか、何かが動いてその結果が0と成っているのかとか別な方に目が行ってしまいました。

単にクリアされていたとは?

作りに問題もある様ですし、もう少し考えて見ます。
NM
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 93
投稿日時: 2004-08-10 10:35
やっと、この件については解決しました。

FTPツールの機能を作っている訳ですが、PUTの機能で子プロセスが走っていて、そちらでエラー判定をして呼び出し元に強制的に戻る仕組みになっていたため、エラーが発生した場合には子プロセスからエラー通知(この場合4)で強制的に戻り、終了処理が走ることにより親プロセスがノーマルとして終了し呼出し元に戻るため最終的にノーマル終了となっていました。

子プロセスの終了がexitの方が良いのかReturnの方が良いのか私の知識では判断が付きませんが双方試してみましたが同じ結果となりました。
1

スキルアップ/キャリアアップ(JOB@IT)