2016-12-05 8 views
0

RETURNキーを押すのを待つ方法の1つは、std :: ignore()を呼び出すことです。しかし、私がnohupを使用すると、std :: ignore()は常にただちに戻ります。 keypressを待つ代わりの方法が存在するのでしょうか、それともnohupでうまくいくのでしょうか?nohupとstd :: ignore()が一緒に動作しない

答えて

3

コマンドを実行するためにnohupを使用する場合、それはは/ dev/nullにあなたのコマンドの標準入力を接続しているので、ためキー操作のいずれか種類を待つ方法はありません。

/dev/nullからの読み取りを試みると、自動的にEOFで応答します。

私はこれが(未テスト)以下のコードを使用してチェックすることができると思います。これは std::cinは、標準入力に関連付けられていることを標準保証として、動作するはず

#include <unistd.h> 
... 
if (isatty(fileno(stdin))) ... 

+0

ええ、それは戻ってはいけません。私の場合、無限ループにつながります。入力のリダイレクトはlinuxでのみ起こることに注意してください。 – user1095108

+0

これは、/ dev/null _does_からの読み込みです。すぐに0バイト読み込みで戻ります。ああ、POSIXは、nohup _指定されていないファイルからの標準入力をリダイレクトして、関連する端末があるかどうかを指定します。それをすべてのプラットフォームで読むことはおそらく脆弱です。 – Useless

+0

ストリームが終了したときに戻ってはならない場合、どうしたらよいでしょうか?永遠にブロックする? –

0

私はこの問題を解決:

std::this_thread::sleep_for(std::chrono::system_clock::duration::max()); 
+0

あなたはただ永遠に眠りたいのですか?私はその質問からそれを推測したことはありませんでした。 – Useless

+0

stdinからの読み込みはすぐに戻りますので、唯一行うことは無期限に待つことです。 – user1095108

+0

私は、あなたが達成しようとしていることを決して言わなかったことを指摘しています。これはむしろ潜在的な回答の質を制限します。 – Useless

1

から

キー入力を待つ別の方法が存在していますか?

キー押しはどこかから来ている必要があります。制御端末からを取得する予定で、意図的にその端末からプロセスを切断しました

はい、選択肢が存在する:

  1. あなたは
  2. ではなく、Xからあなたkeypressイベントを取得し、そこからの入力を取得したい場合は、
  3. を実行しているグラフィカル環境を持っていると仮定すると、端末からの接続を切断しません。
  4. 新しい端末を作成し、そこからあなたのキーを取得してください。これはおそらく実際にはxtermを実行することを意味するので、それは自明ではありません。

またはnohupで正常に動作しますか?

すでに

std::ignore()リターンを行い、そして、あなたはそれについて不平を言っています。 keypressがあなたのために働く唯一のものを待っていますか?

+0

私はApplicationクラスを持っています。コンソールアプリケーションでは、RETURNを待つためにstd :: ignore()を実行しましたが、これはただちに返されるため、不定期の遅延が発生しました。 – user1095108

関連する問題