こんにちは.タイトルのままなのですが,c言語でstdinに何かが入力されるまで待つことなく,stdinの監視がしたいです.例えば, whileループを回してる最中に,qがstdinに入力されたらbreakするけど,あとは普通に回る,みたいな感じにしたいです.fgetc(stdin)とすると,毎回入力を待つことになるので,待たないで回る方法が知りたいです.
具体的には,以下はgnuplotにsinカーブを表示するプログラムですが,コメントアウトしてある
/* if((buf = fgetc(stdin)) == 'q'){
break;
} */
の部分のようにすると毎回とまってしまいます.これを,毎回入力を待たずに,qを打ったら止まるようにするにはどうするのが普通なのでしょうか.
返信おまちしております.
#include <stdio.h>
#include <math.h>
#include <unistd.h>
FILE *gp;
#define omega (M_PI/2)
#define A 1
#define N 10
int i;
int j;
double x, t;
int main(void) {
gp = popen(gnuplot, "w");
fprintf(gp, "set xrange [0:11]\n");
fprintf(gp, "set yrange [-3.5:3.5]\n");
fprintf(gp, "set xlabel \"x\"\n");
fprintf(gp, "set ylabel \"y\"\n");
char buf;
for (j = 0; j < N*160; ++j) {
usleep(5000);
/* if((buf = fgetc(stdin)) == 'q'){
break;
} */
fprintf(gp, "plot '-' with lines linetype 1\n");
for (i = 0; i < j+1; ++i) {
t = 0.1*i;
x = A*sin(omega*t);
fprintf(gp, "%f\t%f\n", t/10, x);
}
fprintf(gp, "e\n");
}
fprintf(gp, "exit\n");
fflush(gp);
pclose(gp);
return 0;
}
No.4ベストアンサー
- 回答日時:
#2です。
>返信ありがとうございます.自分でも動かせました.ただ内容は完全には理解していない気がします.こういうシステムの方まで操作する系のプログラムってどういう本で勉強するものなのでしょうか? >Linuxの教科書などになるのでしょうか?
今回のselectに関しては、ネットワーク通信でノンブロッキングによるTCP/IPの通信を行うときに必須でした。そのときに、参考にしたのは「UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI」です。(W・リチャード・スティーブンス著)(但し、難度は高いです)
実際に業務で使用されるプログラムを書く場合は、徹底的なエラー対応処理が求められますので、
上記の本は、非常に参考になりました。但し、作成するプログラグが業務で使用されるものでない場合は(多少のフリーズなどが大目に見てもらえるなら)もっと簡単な参考書でよいかと思います。
No.3
- 回答日時:
_kbhitと_getchの組み合わせでどうでしょう?
_kbhitはWindows版にしかありませんが、ネットで検索したらLunux用に作っている方がいたのでそちらを用いれば使えるかと。
No.2
- 回答日時:
#1の方のselectを使いなさいというアドバイスに従って作りました。
あなたのプログラムに追加を行いました。
////以下の文を追加/////
・・・・・・
/////////////////////
が追加したところです。
以下のようにして下さい。
----------------------------------------------------------------
#include <stdio.h>
#include <math.h>
#include <unistd.h>
//////以下の文を追加//////
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
int read_q(void);
int SockSelect (int sd_list[],int num_sd,long u_sec,int *ready_num_sd,int r_sts[],int *error_no );
//////////////////////////
FILE *gp;
#define omega (M_PI/2)
#define A 1
#define N 10
int i;
int j;
double x, t;
int main(void) {
gp = popen("gnuplot", "w");
fprintf(gp, "set xrange [0:11]\n");
fprintf(gp, "set yrange [-3.5:3.5]\n");
fprintf(gp, "set xlabel \"x\"\n");
fprintf(gp, "set ylabel \"y\"\n");
char buf;
for (j = 0; j < N*160; ++j) {
usleep(5000);
/* if((buf = fgetc(stdin)) == 'q'){
break;
} */
/////以下の文を追加////////////
if (read_q() == 1) break;
///////////////////////////////
fprintf(gp, "plot '-' with lines linetype 1\n");
for (i = 0; i < j+1; ++i) {
t = 0.1*i;
x = A*sin(omega*t);
fprintf(gp, "%f\t%f\n", t/10, x);
}
fprintf(gp, "e\n");
}
fprintf(gp, "exit\n");
fflush(gp);
pclose(gp);
return 0;
}
/////以下の処理を追加////
#define MuS (1000000L) /* MEGA uSECOND */
#define RET_OK(0)
#define RET_SELECT_ERR (-2)
#define RET_TIMEOUT(-1)
#define SD_STS_NOT_READY (0) /* not ready for reading */
#define SD_STS_READY (1) /* ready for reading */
#define TIME_USEC_0 (0) /* Time out wait = 0 [usec] */
//qで終了(1を返す)
int read_q(void)
{
int ret, err_cd, sd_list[10], sd_list_num, r_sts[10], r_sts_cnt;
char*cp0;
charin_buf[256];
sd_list[0] = 0;
sd_list_num = 1;
ret = SockSelect(sd_list,sd_list_num,(long) 5000,&r_sts_cnt,r_sts,&err_cd);
if (ret != RET_OK) return 0;
if (r_sts[0]==SD_STS_READY){
fgets(in_buf,64,stdin);
if (in_buf[0] == 'q') return 1;
}
return 0;
}
//select
int SockSelect ( int sd_list[],
int num_sd,
long u_sec,
int *ready_num_sd,
int r_sts[],
int *error_no ) {
int ret_value = RET_OK;
int i;
int rtni;
int max_sd;
int sd_num;
fd_set sds, wds, eds;
struct timeval timeout;
*error_no = 0;
*ready_num_sd = 0;
FD_ZERO( &sds );
FD_ZERO( &wds );
FD_ZERO( &eds );
sd_num = num_sd;
for ( i=max_sd=0; i<sd_num; i++ ) {
FD_SET( sd_list[i], &sds );
if ( sd_list[i] > max_sd ) {
max_sd = sd_list[i];
}
}
timeout.tv_sec = u_sec / MuS;
timeout.tv_usec = u_sec % MuS;
errno = 0;
rtni = select(max_sd+1,&sds,&wds,&eds,&timeout );
if ( rtni < 0 ) {
*error_no = errno;
ret_value = RET_SELECT_ERR;
return( ret_value );
} else if( rtni == 0 ) {
ret_value = RET_TIMEOUT;
for ( i=0; i<sd_num; i++ ) {
r_sts[i] = SD_STS_NOT_READY;
}
return( ret_value );
}
for ( i=*ready_num_sd=0; i<sd_num; i++ ) {
if ( FD_ISSET( sd_list[i], &sds ) ) {
r_sts[i] = SD_STS_READY;
*ready_num_sd = *ready_num_sd +1;
} else {
r_sts[i] = SD_STS_NOT_READY;
}
}
if (*ready_num_sd == 0) {
ret_value = RET_TIMEOUT;
}
return( ret_value );
}
/////////////////////////////////////////////////////////////
CentOS6.3で動作確認済です。
返信ありがとうございます.自分でも動かせました.ただ内容は完全には理解していない気がします.こういうシステムの方まで操作する系のプログラムってどういう本で勉強するものなのでしょうか? Linuxの教科書などになるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
つい集めてしまうものはなんですか?
人間誰もは1つ「やたらこればかり集めてしまう」というものがあるもの。 あなたにとって、つい集めてしまうものはなんですか?
-
【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
2024年は「名探偵コナン30周年」「涼宮ハルヒ20周年」などを迎えますが、 あなたが「もうそんなに!?」と驚いた○○周年を教えてください。
-
ホテルを選ぶとき、これだけは譲れない条件TOP3は?
ホテルを探す時、予約サイトで希望条件の絞り込みができる便利な世の中。 あなたは宿泊先を決めるとき「これだけは譲れない」と思う条件TOP3を教えてください。
-
自分のセンスや笑いの好みに影響を受けた作品を教えて
子どもの頃に読んだ漫画などが その後の笑いの好みや自分自身のユーモアのセンスに影響することがあると思いますが、 「この作品に影響受けてるな~!」というものがあれば教えてください。
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
waitせずにキー入力があった場合のみ処理をさせたい(C言語)
C言語・C++・C#
-
Linuxで入力待ちなしkeyread関数のようなものはありますか?
C言語・C++・C#
-
C言語 1文字入力(Enterキーなし)
C言語・C++・C#
-
-
4
fgetsなどのときのstdinのバッファを消すには?
C言語・C++・C#
-
5
テキストカーソル位置の取得
C言語・C++・C#
-
6
C言語で、文字とか入力されなくても実行を続けたい
C言語・C++・C#
-
7
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
8
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
9
getchar使用時の入力文字消去方法
C言語・C++・C#
-
10
配列の要素数に変数を入れたいときには
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
複数桁10進数の*桁目だけを抽出...
-
std::set<int> で、ある値が何...
-
ラップ関数とはどんなものですか?
-
C言語 エラーの原因がわからな...
-
if と配列の組み合わせ
-
C++でRPGを作成する際のステー...
-
C言語での引数の省略方法
-
c言語の配列を使ってサイコロを...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語
-
C#の質問
-
実数の整数部,小数部の取得
-
C言語での奇数の和
-
C言語 等差数列問題
-
(マルチスレッド)_beginthrea...
-
PowerShellがうまくいかない
-
systemの戻り値を取得する方法
-
任意の文字列のアルファベット...
-
(int *)の意味
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
複数桁10進数の*桁目だけを抽出...
-
ラップ関数とはどんなものですか?
-
(int *)の意味
-
c言語の配列を使ってサイコロを...
-
【C++】関数ポインタの使い方
-
(マルチスレッド)_beginthrea...
-
「{ } で囲むだけ」は正しい?
-
if と配列の組み合わせ
-
C言語でlookupのような関数って?
-
数字列を3桁ごとにカンマで区切...
-
課題でつまってます・・・
-
read関数をノンブロッキングで...
-
実数の整数部,小数部の取得
-
system関数がうまくいかない
-
商と剰余を同時に求める(C言語)
-
std::set<int> で、ある値が何...
おすすめ情報