• ベストアンサー

プログラムの一時停止

OSはubuntu、言語はC++を用いております。 Ctl+Zは、メモリの中の実行ファイルのイメージを保存して一時停止しているのだと思いますが、 あんな感じで、再起動した後でも今まで動いていたプログラムを実行しつづけるというのは可能でしょうか? 理想を言えば、 「プログラム中に、データを書き込む(Ctl+Zに相当)ための命令があって、 定期的にその命令を実行し、 再起動後はその命令を最後に実行したところからもう一度実行する。」 ということです。

noname#108554
noname#108554

質問者が選んだベストアンサー

  • ベストアンサー
  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.6

再実行のために必要なデータが何か決まっていて、 再実行時に利用できるようにプログラムがそれらのデータを出力できるのなら何も難しくはないですものね。 再実行のための何かOSのサポートがないと、 たぶん、一般のプログラムでは困難でしょう。。。 === (signal() を使ってしまってますが(笑)) #include <iostream> #include <fstream> #include <csignal> #include <unistd.h> bool stop = false; unsigned int num_iter = 0; void handler(int sig) { using namespace std; signal(SIGUSR1, SIG_IGN); stop = true; } void do_work(unsigned int n) { std::cout << "hello, " << n << '\n'; sleep(3); } int main(int argc, char *argv[]) { using namespace std; if (argc > 1) { std::ifstream ifs(argv[1]); ifs >> num_iter; } std::cout << getpid() << '\n'; signal(SIGUSR1, &handler); while (true) { do_work(num_iter++); if (stop) { std::ofstream ofs("restart.txt"); ofs << num_iter << '\n'; break; } } } === % ./a.out 2680 hello, 0 hello, 1 hello, 2 hello, 3 % kill -USR1 2680 % ./a.out restart.txt 3432 hello, 4 hello, 5 ....

noname#108554
質問者

お礼

こちらの環境でコンパイルすると、最後の行のところで、 warning: no new line at end of file という警告がでるのですが、これはいいのでしょうか? 無視して実行すると、 PID hello, 0 hello, 1 hello, 2 hello, 3 ・・・ まではうまくいきます。そして、Ctrl+Zで止めて kill -USR1 PID とするわけですが、restart.txtというファイルは生成されません。

その他の回答 (8)

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.9

Ctrl-Z の発行するシグナル SIGTSTP はキャッチできる(SIGSTOP がキャッチ不可だったのかな。。。^^;)みたいですね。 なので、プログラムの SIGUSR1 のところを SIGTSTP に変えれば、 その端末で Ctrl-Z するだけでよくなります(kill -USR1 procid の代わりに)。 まぁ、stty かなにかで Ctrl-Z で SIGUSR1 が発行されるように変更しておけば見た目は同じですけどね^^ いずれにしてもシグナルは、きちんとしたプログラムでは 使わないほうがいいと思いますし、それでも使いたいというなら きちんと認識をしてからにするようにお勧めします。 システムコール呼び出し中にシグナルが発行された場合など システムコールが再実行されるのかされないのか、 シグナルの連射がきたときに大丈夫か、 シグナルが発行された回数きちんとキャッチできるのか、などなど。

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.8

最終行に改行がないのは、コピペしたときに改行が入らなかっただけでは? あと、Ctrl-Z で発行されるシグナルはキャッチできないので、 Ctrl-Z で発行されるシグナルは処理できません。その時点でプログラムは停止しています。 なので、Ctrl-Z をしないで、別の端末などから、kill -USR1 procid のみしてみてくださいませ^^

noname#108554
質問者

お礼

>最終行に改行がないのは、コピペしたときに改行が入らなかっただけでは? そうみたいです。 他のプログラムは改行が入ろうと入るまいとちゃんと動くのですが・・・ それはともかく、動きました。ありがとうございます。 これが自分のプログラムでも使えるかどうか、検討してみます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.7

こっちはもっと C 寄りで: 「再起動後に実行を再開する」の「再開する場所」が固定なら, 1.特定のタイミング (例: 定期的に) でデータを (特定のファイルに) ダンプする 2.再起動後に実行を再開するときには, 1 でダンプしたファイルの内容から「実行を再開するべき場所」などを見付ける という方針でできなくもないです. あんまりしたくないけど. そうじゃないと, ほとんど無理じゃないかなぁ. undump があれば別だけど....

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.5

スナップショット的な主記憶のコアイメージを保存して、 それを後に再開する機能が備わってるかどうかということなら、 プログラミング言語は関係なく、OSの機能の問題ですよね。 そのようなシステムコールがあるのかどうか、 「Linux系OS」のほうへ質問を投げてみれば?^^ わたしはまた、再開できるポイントをプログラム自身で決めていて、 そこにあわせてデータを吐けばいいようにと思っていて、 再開データ出力の指示のみ受け取る方法を回答すればいいのかと。。。思い違いしていたようですね。任意の時点なのですよね。。。

noname#108554
質問者

お礼

えーと、どちらでもいいです。 「Ctl+Zみたいな命令」で一時停止→再起動→プログラム再開 でもいいですし、 「プログラム中の再開できるポイント」で一時停止→再起動→プログラム再開 でもいいです。 あえていえば簡単なほう・・・ですかね。 Linux系OSでも質問してみますね。

回答No.4

ANo.1の人です。 そのプログラムがどんなプログラムか分かりませんから >実行の状態を自分で保存して、再開のときにそれを復元する必要がありますね。 と抽象的なことを書くしかないわけです。 処理に使っているすべての情報(変数の値など再開に必要なすべての情報)を自分で考えた形式でファイルに保存することになるでしょう。 > データを書き込む(Ctl+Zに相当)ための命令 を当該プロセスに送る必要があります。 関係のない他のプロセスに直接働きかける方法はシグナルしかないですから、 ・ANo.2さんの、当該プロセスがファイルの存在をときどきチェックする方法 ・当該プロセスがソケットを開いておいて、そこに接続があったら保存する方法 などの代わりの方法を考える必要があります。

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.3

ほんとにシグナル処理をなされるのなら、 『詳解UNIXプログラミング』 W.リチャード・スティーヴンス著 大木 敦雄訳 税込価格 : \8,190 (本体 : \7,800) 出版 : ピアソン・エデュケーション ISBN : 4-89471-319-5 が、参考書としてお勧めです。ちと、高いですが^^;

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.2

Ctrl-Z はSIGTSTP でしたっけ?再開は SIGCONT だったでしょうか。。 これらのシグナルは、「無視」か「デフォルト動作」かしかできない(キャッチできない)規約になっていた気がします。 ご自分で SIGUSR1 などで、シグナルハンドラを登録すればできますよね。プログラムのプロセスにコマンドラインから kill コマンドかなにかで、キャッチすることにしたシグナルを送ればいいです。 シグナルをもし使うなら、<signal.h> の signal() とかではなく、 sigaction() のほうで取り扱ったほうがいいと思います。 しかし、シグナルは使わないに越したことはないので、 たとえば、起動時にでもフラグのための、ファイル名を指定しておいて、 プログラムで定期的にそのファイル名のファイルがあるかどうかチェックする。あればデータを書き込みフラグファイルを消し、なければデータを書かずに処理を続ける。。。みたいな仕組みにして、シグナルは 使わないようにするのがポータビリティがあると思いますし、 確実な動作が可能になると思います。

回答No.1

実行の状態を自分で保存して、再開のときにそれを復元する必要がありますね。 そして、シャットダウンを検知したら、上記の保存をおこなう必要があります。

noname#108554
質問者

お礼

ありがとうございます。 >実行の状態を自分で保存して、再開のときにそれを復元する必要がありますね。 ええ、そのとおりです。 >そして、シャットダウンを検知したら、上記の保存をおこなう必要があります。 まあ、そのとおりなんですが、そこまでは要求しません。 「データを書き込む(Ctl+Zに相当)ための命令」の次のところから 再開できれば十分です。 質問はその方法についてです。

関連するQ&A

  • プログラムを一時停止→再起動→続きから再実行

    http://okwave.jp/qa3279922.html の訂正版です。 OSはubuntu、言語はC++を用いております。 Ctrl+Zでプログラムを一時停止できると思いますが、 そのまま再起動すると、もうそのプログラムは一時停止した場所からは 再開できません。 Ctrl+Zは、プログラムのデータ・状態をHDDに書き込んでいるのだと思いますが、そのファイルが、 1.シャットダウンしても消えないようにする 2.再起動後、プログラムを続ける 方法がありましたら、教えてください。

  • プログラムの一時停止について

    Linuxである計算プログラムを実行しています。そのパソコンをシャットダウンする必要があるので、現在動いているそのプログラムをシャットダウン前に停止して、パソコンの再起動後に計算も復帰させたいと思っております。そのプログラムに一時停止機能はございませんので、OS側でその作業を行いたいと思っています。 はじめ、”kill -STOP プロセスID”でプログラムを停止して、”kill -CONT プロセスID”で復帰できると思ったのですが、それで復帰させようと思うと、そのようなプロセスIDはありませんというエラーメッセージが出ました・・・。パソコンを停止しなければ、そのコマンドで上手く停止・復帰が出来たのですが・・・。 パソコンを再起動しても、実行プログラムを停止・再開させる方法をご存知の方がいれば、是非アドバイスを頂きたいです。

  • プログラム実行時の、一時停止の命令文

    初心者ですが、Visual C++6.0での、 プログラム実行時の、一時停止の命令文が、存在しますか? 返答、お願いします。

  • プログラムの一時停止

    VisualBasic6.0で機器の制御を行なっております。 プログラムの実行途中で接続機器とのタイミングをとるため数十ミリ秒から数秒のWait(プログラムの一時停止)をプロシージャの途中に入れたいと思ってます。 バックグラウンドで動作しているWindowsのほかのプログラムへは極力影響を与えずにWaitが記述されているプロシージャだけを一時停止したいと考えてます。 Windows以前のプログラムでしたらコード中にFor~Next等の空ループを入れたりして対応することも出来ましたがWindows上のプログラムでそのようなことをしたら環境への負担が大きいですしWait時間が安定しないと思うのでしたくないのです。 このような時はどうしたらよいでしょうか

  • 一時停止プログラムの作成

    いつも皆さんのご意見参考にさせて頂いています。 今日はプログラムについて教えて頂きたいのですが。 先日よりMCの3D加工で悩んでいます・・ 粗取り時間が20時間と長いので工具のチップがもたなくて 2本ダメにしてしまいました。 日中に加工が終われば良いのですが、夜も掛けて帰って 数時間後に見に来ると刃先がなくなっていました。 それで、4時間ほどでチップが駄目になるので その前に一時停止するプログラムを作りたいのですが・・・ NCはファナックの0Mです。 今までCAD・CAMに頼っていたのでイマイチ要領がつかめません。 作りたいプログラムは、加工途中でZを50mm上げて主軸、切削油停止。 サイクルスタートで元の位置まで戻り、再加工。 と言う様なプログラムを作り、編集ソフトで3時間ほどの所に そのプログラムを挿入したいと思っています。 どなたかご教授よろしくお願いします。

    • ベストアンサー
    • CAM
  • ノートンの一時停止の仕方

     ゲームソフトをダウンロードしたいんですが、「アンチウィルスソフト等の常駐プログラムが動作している場合、正しくダウンロードできない場合がございます。お手数では御座いますが、ダウンロードを実行される間だけ、常駐プログラムを停止させてアクセスをお試しください。」 と出てゲームができないんです。ノートンのHPを見たんですけど細かい所までのってなくて・・・。  後、一時停止させた後にまた元に戻す方法も教えて頂けたらなぁと・・・。 情報が少なかったら付け足しますので、よろしくお願いします。

  • ファイアウオールのみ一時停止するには。

    富士通のFMVアプリケイション「映像館」を起動させて画像を加工した後、Emal送信を一連の加工操作から始まり、完結した画像情報を送信する操作を日常行っていますが、今回送信が閉塞される現象が発生しています。前回のトラブルの際に「ファイバーウォール」のみ一時停止して送信するとクリヤーしましたが、今回はその操作の表示ガイドがありません。「全ての機能を無効にする」の案内はありますが、これを実行した場合、該当プログラムは生きているものと考えますが再復帰はどの様なオペ手順になるのでしょうか。FMVアプリケイションに問題があるのか?セキュリテイに問題があるのか検証中ですので、至急一時停止する方法をサポート願いたいと思います。付け加えますがOutlookExpressを起動させて画像を選択し挿入による送受信はノーマルに機能します。このトラブルシューテイングはMicroSoft並びにFMV両者のサポートにより検証中ですので適切なサポートを おねがいします。

  • Cで他のプログラムを起動させる命令

    C言語でプログラムを作っているのですが、他のプログラムを起動させる命令が分かりません。そのプログラムが起動し、処理が終わった後は起動させたプログラムの作業に戻るようにしたいです。 後、引数もプログラムに渡したいです。 何かいい命令を知っている方はお願いします。

  • ubuntuでC++のGUIプログラム

    C++でゲームを作りたいと思っているのですが、C言語はあるていどは分かるのですがC++はまったくやったことがありません。 そこで質問ですが、「ubuntuでC++のGUIプログラム」は作れるのでしょうか? WindowsとLinux系OS(Ubuntu)の両方で開発できるのが理想です。 初心者なので質問が上手くありませんが、答えていただければ幸です。

  • CPUがメモリ上の命令を実行する流れについての質問

    CPUがメモリ上の命令を実行する流れについての質問です。 CPUがメモリ上の命令を実行流れについてなのですが たとえば,「Wordが起動する」までの流れがあるとして ① 「Wordを起動する」という命令がメモリ上にある ② CPUがその命令を読み取り,Wordを起動し,その演算結果をメモリに返す ③ メモリ上に「Wordが起動されている」結果が一時的に保存されている おおまかな流れはこうではないのでしょうか?

専門家に質問してみよう