• 締切済み

C言語で、文字とか入力されなくても実行を続けたい

現在簡単なゲームをunix系のOSのC言語でつくってますが なにも入力されなくても停止せず実行を続けられる getcharのような関数はないのでしょうか? windows系のOSにはcons.hヘッダーあたりに そんな関数あったような気がするのですが。。。 普通のgetcharだと、文字が入力されるまで(enter押されるまで) そこで実行が一時中断されてしまい リアルタイムで動くプログラムができないのですが。。。

みんなの回答

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.6

kbhit()相当の関数を作ればいいのですが... こちらをよく読むと参考になるかもしれません。 http://www.nishimoto-site.net/archiver/fj/os/linux/200210/msg00089.html

参考URL:
http://www.nishimoto-site.net/archiver/fj/os/linux/200210/msg00089.html
winterofmeei
質問者

お礼

回答ありがとうございます これらのページを参照してみようとおもいます

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.5

再びNo.4です。 前の回答中に書いたCBREAKモードは、Enterキーの入力を 待たずにキー入力を行う機能でした。 今回は関係ありませんので、無視して下さい。

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.4

一般的には、マルチスレッドにする必要は無いと思います。 No.1さんのご指摘通り、ioctl()を使ってrawモード(CBREAKモードというのもあったような気が...) にすれば、getchar()が直ちに-1を返すようにできると思います。 ただ、お使いのUNIXやデバイスによって、制約はあるかもしれません。

winterofmeei
質問者

お礼

回答ありがとうございます ioctlを調べて使ってみようと思います

  • garyu77
  • ベストアンサー率45% (30/66)
回答No.3

イマイチ意味が分からないのですが。。。 consio.hのgetch、getche辺りの話をしてるのかな? それとも入力待ち時間中も別処理をしたいって事ですかね? そうなると通常のProgramでは一本の動きしか出来ませんよ。 あくまで【通常】ですけどね。 入力待ちの時に別処理をしたいのであれば、プロセス管理とかしないと無理かなぁ… プロセス管理を行って、処理Aをさせている最中に処理Bするって事になるとforkとか....

winterofmeei
質問者

補足

実行が停止しないgetcharみたいな関数とは windowsのconsio.hのgetchとかのことです うろ覚えであいまいな書き方になってました… 例えばシューティングゲームを作るとしたら、 プレイヤーが何にも入力してなくても ゲームの処理は実行されてなければなりません。 でも、C言語標準のgetchar関数では 入力が終了するまでプログラムの実行が 停止されてしまうので、 そうならない関数や方法を探してるのです。 あと、forkとかできれば使いたくはないのですが… 一つのプログラムだけでできないのでしょうか…

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.2

原始的な方法ですと… プログラムA(実際の処理) ファイル"test.txt"を開く。 ファイルに文字が入力されていれば何らかの処理を行い、空のファイルを上書きする。 ファイルを閉じる。 リアルタイムの処理を実施。 繰り返し。 プログラムB(入力処理) getcharで入力を待つ。 入力を受け付けたらファイル"test.txt"を開いて何か書き込む。 繰り返し。 の2本立てで動作するとか。 (上の仕様だとイロイロ問題が起きて、それはそれで面白いのですが…) -- 最近の普通の方法ですと、マルチスレッドとか、スレッド同期とか、そういうキーワードで情報収集してみては?

winterofmeei
質問者

お礼

回答ありがとうございます。 複数のプログラムを一度に実行するつもりもなく マルチスレッド等を用いるつもりもありませんでしたが こういう方法も試してみようと思います。

回答No.1

はじめまして。 Linuxに関してしか知らないので、その点はご了承ください。 Googleで「stty」、「Linux」、「rawモード」をキーワードにして検索したところ、参考URLのページを見つけました。 MLの過去ログですので、その前後を参照していただければ、もう少し詳細が分かるかもしれません。 ・・・と、最近こればっかりですので、もう少し。 「Linux システムコール」(塚越 一雄 著/技術評論社  ISBN4-7741-1031-0)という本があるのですが、この本にも関連する話題が載っています。 システムコールについて書かれた本なのですが、私が手に取った本の中では、一番読みやすくまとめられていました。 他の情報源としては、JFやJMが挙げられるかと思います。 日本語で情報を得ることができるので便利です。 JF → http://www.linux.or.jp/JF/ JM → http://www.linux.or.jp/JM/ 長文・駄文、失礼致しました。

参考URL:
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/~poffice/mail/linux-users/51646?help
winterofmeei
質問者

お礼

回答ありがとうございます 参考URLを参照してみようと思います。

関連するQ&A

  • C言語で、ioctlを使用し入力待ちつつ実行を続けたい

    C言語で入力を読むときgetc関数やscanf関数を 使用することが多いのですが これらの関数を使用すると入力が完了するまで そこでプログラムの実行がストップしてしまい リアルタイムで処理できません そこでioctlを使用して ioctl(0, I_NREAD, &n) というコードを書き、入力があったかどうかを調べようと思いました ところがこの方法だとenterが入力されない限り キー入力があったと認識されないので たとえば"a"、"b"、"c"、"d"と入力してもすぐには読み込めず この入力のあとにenterを入力して はじめて文字が読めます enterが入力されなくても、入力された文字を調べるには どうしらたよいのでしょうか?

  • c言語の実行が分かりません

    C言語のプログラムを実行させる方法が分かりません。 unixでC言語を以下の手順で学習しています。 1 emacs上でファイル名.cというソースファイルを作成。 2 xterm上で gcc ファイル名.c と入力 その後xterm上で後一つコマンドを入力すればいいのですが、そのコマンドを忘れてしまいました。教えていただければ、ありがたいです。

  • ある特定も文字'#'が入力されるまで実行

    C言語である特定の文字#が入力されるまで 入力し、#が入力されたら、合計を出力するプログラム はどのようだと思われますか? #はgetchar()でとるのが最善でしょうか?

  • C#でキーボードの入力を自動で実行し繰り返すプログラム

    タイトルの通りでC#でキーボードの入力を自動で実行し、繰り返すプログラムを作りたいんですが、キーボードの入力を自動で行うプログラムはどう記述すればよいのか分かる方教えて貰えないでしょうか?また、参考サイトなどがあれば教えてください。 ちなみに作りたいプログラムの内容は、 完成したプログラムのボタンを押すと、 F8 → 2秒停止 → Enter → 2秒停止 → Enter と自動で実行されるみたいな感じです。 分かる方、お願いします。

  • Macターミナルで実行中のプログラムを中止するには?

    Macのターミナルでプログラムを走らせているとき、 実行中のプログラムを一時停止したり中断・終了させるには どうしたらいいでしょう? Unixだと、Control+s とか Control +c とかでできますよね。 Macだと、それではできないみたいなんです。 基本的な質問ですみませんが、どなたか教えていただけないでしょうか。

  • C言語について質問です

    windowsで作ったプログラムで、プログラムの途中にscanfを入れて、何か入力されるまで処理を停止するというプログラムを作りました。 これを同じようにリアルタイムのUbuntuでも作って実行してみたところ、プログラムがscanfを入れた部分で停止してしまいました。 LinuxとWindowsでプログラミングの仕方が違うのでしょうか。 Linuxでキー入力されるまで処理を停止するようなプログラムを作るにはどうしたらいいのでしょうか。。

  • C言語 ドラッグとファイル名の表示

    はじめまして。 C言語を学習しています。 PCのOSはWindows XPです。 ドラッグしたファイルのファイル名を表示する方法として参考書に例文が載っていますが、以下の部分が理解できません。 1、参考書に、「【fflush(stdin);】という記述は、出力バッファを強制出力する関数である fflush で、入力バッファである stdin をクリアしています。」との説明があります。 出力バッファの意味と入力バッファであるstdinについての説明が参考書に無く、ネットで調べましたが理解できる記事がありませんでした。 出力バッファの意味と入力バッファであるstdinの意味を教えてください。 2、【getchar();】は、実行されるとキーボードからの入力を待ち、エンターキーが押されると入力待ちを終了、入力したうちの1文字目を返り値として返す関数とのことですが、下記のプログラムでどのような役割をしているのか教えてください(下記のプログラムになぜgetchar関数が必要なのかがわかりません)。 なにとぞ、よろしくお願い致します。 ●参考書の例文 次のプログラムは、プログラム実行画面(コマンドプロンプトのような黒い画面)にデスクトップ等のファイルをドラッグし、そのファイル名を表示する例です。 #include <stdio.h> int main(int argc,char *argv[]) { if (argc > 1) { printf("%s\n",argv[1]); } fflush(stdin); getchar(); return 0; }

  • C言語などプログラム言語はパソコンのどこに入力し、実行するのでしょうか。専用のパソコンが必要でしょうか?

    C言語などプログラム言語は実際にどこに入力し、実行するのでしょうか。 専用のパソコンでできるのでしょうか?

  • C言語でホスト(Unix)にプログラム/プロセスを送信して実行する方法

    C言語でホスト(Unix)にプログラム/プロセスを送信して実行する方法を探しています。 用途はまだ具体的に決まってませんが 例えば、ある与えられたコマンドを各ホストに一斉送信して その結果をまとめて取得する、ようなことがしたいです。 どんなに難しくなってもいいので、いい方法や関数があったら教えて下さい。

  • C言語についてどうしてもわからない疑問

    プログラミング初心者です。 C言語を勉強中に疑問に思ったことが2つあります。 まず1つ目。 C言語以外のプログラミング言語、例えばjavaとかC#とかjsとかpythonとかrubyとかPHPとか、には開発者にとって便利なライブラリとかフレームワーク(僕にはこの2つの明確な違いがわかりません。が、どちらも「開発者が定義しなくてもよい関数やオブジェクトの集合」という認識があります)がありますよね。 そのおかげで色んな人達がプログラミングし易くなりました。 ネット(はてぶのホットエントリとか)でも「馬鹿な俺がプログラミングを勉強して〇〇を作った」といった記事をよく目にします。 でも「C言語を使って」というのは聞いたことがありません。 そもそも、C言語はそいういったライブラリやフレームワークが少ないように感じます。 検索してもrailsとかjqueryのようなフレームワーク(ライブラリ?)は見つかりません。 これが無かったらプログラムなんて作れないのでは? しかし、世間にはC言語で作られたプログラムが多いのもまた事実。 C言語ではいったいどのように開発が行われているのか教えてください。 2つ目 unixとかlinuxといったOSはC言語で書かれている聞いたことがあります。 しかし、プログラムの開発は「コードを書く→コンパイル(→デバッグ)→実行」という流れですよね。 ではOSを開発するときに、そのコードをどうやってコンパイルするのでしょうか? コンパイラはOSの上に立っているとするなら、OSがない状態でコンパイラはどこに立てばいいのか。 そこがわかりません。 誰かこの2つの疑問に答えてください。 お願いします。

専門家に質問してみよう