Linux-2.6.18-at9 Debianです。
一度受信を開始してしまったFTP転送を中断、再開はできるのでしょうか?。
状況:
タスク1.ハードウエアへのデータバースト転送(ioctlによる) : 約5msec
タスク2.Host PCへのステータス転送(PC側がClientのTCP/IP) :約2msec
タスク3.PCから大量データをファイルの形で受信するタスク(FTP Client) :残り
が基本タスクとなるシステムがあります。これがWhile文でLoopしており、約50msecに1回タスク1,2が実行されなければなりません。
FTP Client機能によるファイル受信は50msecのloop時間よりははるかに長く設定されています。
そこでタスク1の実行を阻害しないことを期待してFTP受信タスクを別スレッドにしました。しかし別スレッドではあっても一度始まってしまったファイル受信は中断はできないらしく明らかにタスク1の実行は影響を受けています。
次に別スレッドではなくこれを別のProcessにしました。しかし結果は多少は改善しましたが基本的には同じです。
ファイル受信processの要旨は以下のごとくです:
while(1){
errno = 0;
if(msgrcv(msqid, &message, BUFSIZ, read_type, 0) == -1){
perror("msgrcv failure");
break;
}
if (inhbit){
if (filexchg){
system("msh fileRcv.sh file.1"); // msh : bash機能のshell fileRcv.sh : Shell Script
else
system("msh fileRcv.sh file.2");
}
}
二つのファイルを親processの指令とタイミングで交互にダウンロードします。
ftpクライアントの起動にはshellを使っています。
タスク1の実行サイクルが回ってきたら、親がinhibitを発行、FTP受信を中断してもらいたいのですが、bashという別のprocessにコントロールを渡しているのですから、本質的に不可能なことをしているように思います。
仮にFTPのフロー制御ができても再開したときFTP転送の障害が発生する懸念もあります。
親、子間の優先順位をいじることで親のタスクを無条件に優先させる設定ができても親にはIldeループもあり子からみた識別はできません。
タスク1の割り込み化も試みたのですが、実現できませんでした。
何か解決策があればお願いいたします。
TCP/IPにすればパケット単位のフロー制御ができることはわかっているのですが、転送速度が問題になります。
No.1ベストアンサー
- 回答日時:
こんにちは
あまり内容が理解できたませんが、解る範囲で書きます。
>一度受信を開始してしまったFTP転送を中断、再開はできるのでしょうか?。
中断は何かしらの方法で可能でしょうが、FTPでは1個のファイルの再開という
ものはありませんので、1個のファイルは転送しなおしになると思います。
>TCP/IPにすればパケット単位のフロー制御ができることはわかっているのですが、
転送速度が問題になります。
ここの部分は勘違いです。
FTPもTCP/IP通信です。
プログラム構成は
作った通信プログラムー>FTP通信->TCP/IP通信
となっていますので、FTPを使用しないと考えているならば
作った通信プログラムー>FTPに相当する作ったプログラム->TCP/IP通信
となります。
FTPに相当する作ったプログラムはそう簡単には作れないです。
私からのアドバイス
(1)ファイル転送が50msに終わる量であるのか計算する
(2)終わらないのならば50msでの制御は元々不可能
(3)終わらないならば転送するファイルの量を減らす
(4)FTPで転送はする
(5)何を作成しているかわかりませんが工業用ロボット
みたいなものであれば(1)(2)は必須
(6)ファイル転送は、システム的のあればいいだけ
(時間とはあんまし関係ない)のならば、
ファイル送信を監視し、終わったならばデータを
更新する(50msの世界から切り離す)
と適当なことを書いてます。それでは
この回答への補足
gamera4500様
Resありがとうございます。
ご指摘のようにファイルを送信時間50msec以下となるサイズに分割し、肝心のタスク1の終了直後にFTP受信を開始するようにやってみました。
しかし思わしい結果はえられませんでした。原因は不明ですがファイルが小さすぎてサーバであるWindows側でのファイルopen/closeのオーバヘッドの効果が働いたせいではないかと推察しています。
FTPもTCP/IPが基礎にあることは知識としては持っています。しかしTCP/IPはパケット単位で受信を停止再開することはできると思います。Windows側のサーバソフトも自作しているからです。クライアント側はタスク1仕掛中は禁止フラグをあげ、サーバ側に伝えます。本来ハンドシェークしてくれているはずのTCP/IPコネクションを別の信号で制御するという変則的な形にはなりますが。
ただ50msに一回5msの間だけ受信を中断するのですから回線にあるバッファ効果で持ちこたえてくれるような期待も若干はあります。
Linux側が必要とするデータ量は50msあたり32bitレジスタ数で2048です。Linux側のパケットの設定は3000弱となっており、レジスタ1個を10バイトの文字列にしているので256×10つまり256Reg伝送できます。であれば10パケットが約40msの間に受信できれば基本的には充足します。
Ehternetは100Baseですが、1パケットの受信時間は1~2msらしいので十分可能と判断しました。
50msの世界と切り離すため受信タスクの専用スレッド化、あるいは専用プロセス化により『BackGroud化』を試みたのですが、Single CoreのPowerPC、内部クロック300MHzではLinux OSも工夫の余地がなかったのでしょう。
何かご意見があればお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- サーバー Googleドライブなどを使わずにテザリングAndroidでWindowsとファイル共有 1 2023/02/19 13:14
- Windows 10 ソフトの実行を自動化したいです。 1 2022/10/15 16:09
- Outlook(アウトルック) outlookの送信エラーについて 1 2022/05/13 12:04
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- デスクトップパソコン ウイルスに感染しないファイルのバックアップ方法について 5 2022/09/11 11:27
- UNIX・Linux Ubuntuサーバーでメールを受信できない 7 2022/08/23 20:55
- プロバイダー・ISP hpb22の接続方法の変更 1 2023/08/06 18:47
- Android(アンドロイド) タスクやTodoのandroidアプリで、リスト上でタスクの登録日時を表示できるものはありませんか? 2 2023/07/17 17:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
タスクスケジューラからショー...
-
XCOPYでネットワーク越しにコピ...
-
タスクマネージャーの状態の取...
-
再起動後必ず2つのエラーが出...
-
タスクの相関図のわかりやすい...
-
VisualStudioで静的コードチェ...
-
μiTronでの割込み処理について
-
FTP ダウンロードの中断
-
Androidアルバムの画像を消去で...
-
拡張子はなぜ、大文字と小文字...
-
フォルダの並び替えの項目を固...
-
フォルダの中に1個しかファイ...
-
ひとつのファイルを一括で複数...
-
複数のフォルダへ同時にファイ...
-
dirコマンド一文ででフォルダの...
-
Windowsフォルダ内のファイルと...
-
LAME.EXE をダウンロードしたい...
-
softonicという物をダウンロー...
-
パソコンのスキップとは何ですか?
-
XCOPYで指定したフォルダとファ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XCOPYでネットワーク越しにコピ...
-
タスクスケジューラからショー...
-
eclipse の TasksにTODO が出ない
-
batファイルをアンダグラウンド...
-
タスクの相関図のわかりやすい...
-
タスクマネージャーの状態の取...
-
一定間隔でメール送信
-
username以外でログイン名を知...
-
リエントラント関数
-
cgiを使ったページが表示さ...
-
ログイン前にタスクにて実行し...
-
バッチファイルで、プログラム...
-
バッチファイルからメール作成...
-
タスクやプロセス管理について
-
UACの権限昇格の確認ダイアログ...
-
VisualStudioで静的コードチェ...
-
常駐PGの作成方法って?
-
Apache2のインストールが正常に...
-
Vbscriptでアプリ(ソフト)など,...
-
実行中のSendkeysのVBSを途中で...
おすすめ情報