dポイントプレゼントキャンペーン実施中!

一定の間隔であるサーバに接続し、画像ファイルを取得するプログラムを作成しています。

C言語で作成されたプログラムより、以下のようなシェルを実行し、画像ファイルを取得することを考えています。

-----------------------------
#!/bin/sh

ftp -in <<EOL
open 接続先IPアドレス
user ユーザ名 パスワード
lcd ローカルのディレクトリ
cd リモートのディレクトリ
mget data[ABC]_${d}.tar.gz
quit
EOL
-----------------------------

ここで、以下のような問題に悩んでいます。
1.上記シェルを実行し、まさにFTPを行っているとき、LAN断などにより遠隔サーバとの接続が切れたときに、だんまり状態となってしまう。

2.FTPが成功した場合、取得したファイルの正当性が保証されるのか?せめてファイルサイズチェックだけでも行いたいが、FTP実行前にファイルのサイズが取得できるか?

A 回答 (4件)

サンプルを見てようやく分かりました。


ご提示ありがとうございます。

c側からsystemで起動したftpのプロセスを殺したいということでよろしいでしょうか?

この場合は PPIDを検索すればよいのです。
切断するだけのプロセスを起動したほうが楽なのかもしれません。

例えば コマンド名を killchild 親のPID番号 として、fork/execを使用してftpを起動します。
このときにforkされたPIDは認識できると思います。

次に時間が経過した場合に、killchild をsystem()で呼び出します。引数は先ほどのPID番号です。

killchild では、ps -e により全プロセスを取得し、その中でPPIDが引数(ftpの親のPID)と一致するものを検索してそのプロセスを強制切断する

これでいけると思うのですが、いかがでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございました。
ps -e で親のPIDを見れたのですね^^;;

なんとかなりそうです。
感謝します。

お礼日時:2006/01/19 19:48

子プロセスのPIDが取得できないということでしょうか?



子プロセスのPIDは$!で取得できると思いますが…

この回答への補足

なんかちょっと違う気がします^^;;

プロセスAが以下の処理だったとします。
main(){
処理(1)
system("ftp XXXXX");
処理(2)
・・・
・・・
return;
}

systemコマンドにて、ftpを実行しています。

で、FTPの実行中にプロセスAに対して終了シグナルを発行したときに、実行中のFTPプロセスが残ったままとなってしまうのです。
これをKillする方法を知りたいのです。

補足日時:2006/01/19 18:44
    • good
    • 0

親プロセス→子プロセスとしてスクリプト起動→子プロセスのスクリプトからFTPを子プロセスとして起動


このようになるということでしょうか?
この場合には、親プロセスから子プロセスにシグナルを送るようにしてはいかがでしょうか?
子プロセスではシグナルを受けてftpを強制終了させると…
このようにすると、親プロセスは孫プロセスであるftpのPIDを知る必要はありません。

シグナルの捕らえ方はtrap文を参照してみてください。

この回答への補足

たびたびすみません。

>子プロセスではシグナルを受けてftpを強制終了させると…
そもそもの問題はここだった気がします^^;
親でも子でもいいのですが、あるプロセスでFTPを実行した場合に、強制終了はどうやってするのでしょう??

ps -a | grep ftp

上記のようにして、ftpプロセスのPIDを取得してKillすることは考えたのですが、
現在開発しているシステムでは、一度に複数のプロセスが、ほぼ同時にFTPを行うのです。
そのときに、親からシグナルを受けた子プロセスでは、”自分が起動したFTPプロセスだけ”をkillしたいのです。
上記psコマンドでは、FTPプロセスがたくさん存在した場合、どれが自分の子なのか???がわからずに悩んでいます。。。

毎回、言葉足らずで申し訳ないです。
よろしくお願いします。

補足日時:2006/01/19 18:08
    • good
    • 0

1)ftpを子プロセスとして作成して、親プロセス側で時間監視を行い、一定時間経過してもftpのプロセスが終了しない場合には強制的にftpのプロセスを終了させるなどの手はいかがでしょうか?



2)ftpコマンドのsizeでファイルのサイズが取得できますので、それでサイズ一致の確認ができると思います。またls -lでもファイルのサイズは取得できます。

ただし、これらのことをやるとなった場合には途中のmgetで行っているものが扱えない可能性がありますので、先にftpでリモートの全ファイル一覧を取得して、
後からgetで1つずつファイルを転送するようにしないと正しくチェックできないと思います。

参考になりますでしょうか?

この回答への補足

回答ありがとうございます。
1)についてですが、
プロセスAより子プロセスA’を作成し、そこでFTPを実行するようにしたとします。
そうすると、FTP実行中には3つのプロセスが存在しますよね?(FTPを行った時点で一つプロセスが作成されませんか?)

プロセスAでは時間を監視し、一定時間経過後にA’を強制終了することができますが、FTPを実行中のプロセス(A’の子?)のPIDはどのようにしたら分かるのでしょうか?

補足日時:2006/01/19 16:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!