![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?a65a0e2)
こんにちは.タイトルのままなのですが,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;
}
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?a65a0e2)
No.4ベストアンサー
- 回答日時:
#2です。
>返信ありがとうございます.自分でも動かせました.ただ内容は完全には理解していない気がします.こういうシステムの方まで操作する系のプログラムってどういう本で勉強するものなのでしょうか? >Linuxの教科書などになるのでしょうか?
今回のselectに関しては、ネットワーク通信でノンブロッキングによるTCP/IPの通信を行うときに必須でした。そのときに、参考にしたのは「UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI」です。(W・リチャード・スティーブンス著)(但し、難度は高いです)
実際に業務で使用されるプログラムを書く場合は、徹底的なエラー対応処理が求められますので、
上記の本は、非常に参考になりました。但し、作成するプログラグが業務で使用されるものでない場合は(多少のフリーズなどが大目に見てもらえるなら)もっと簡単な参考書でよいかと思います。
No.3
- 回答日時:
_kbhitと_getchの組み合わせでどうでしょう?
_kbhitはWindows版にしかありませんが、ネットで検索したらLunux用に作っている方がいたのでそちらを用いれば使えるかと。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?a65a0e2)
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
このQ&Aを見た人はこんなQ&Aも見ています
-
好きな人を振り向かせるためにしたこと
大好きな人と会話のきっかけを少しでも作りたい、意識してもらいたい…! 振り向かせるためにどんなことをしたことがありますか?
-
いちばん失敗した人決定戦
あなたの「告白」での大失敗を教えてください。
-
もし10億円当たったら何に使いますか?
みなさんの10億円プランが知りたいです!
-
あなたなりのストレス発散方法を教えてください!
自分なりのストレス発散方法はありますか?
-
集中するためにやっていること
家で仕事をしているのですが、布団をはじめ誘惑だらけでなかなか集中できません。
-
waitせずにキー入力があった場合のみ処理をさせたい(C言語)
C言語・C++・C#
-
Linuxで入力待ちなしkeyread関数のようなものはありますか?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
int16_t の _t は何?
-
windows-findstrの正規表現を使...
-
ラップ関数とはどんなものですか?
-
C言語 エラーの原因がわからな...
-
【C++】関数ポインタの使い方
-
acceptをalarmでタイムアウトさ...
-
実数の整数部,小数部の取得
-
PowerShellがうまくいかない
-
int型の変数値をバイト列として...
-
read関数をノンブロッキングで...
-
クイックソートプログラムでセ...
-
C++プログラミングコードにポリ...
-
エラー 添字が付けられた値が、...
-
#define _CRT_SECURE_NO_WARNIN...
-
配列変数のポインターが勝手に...
-
ビットフィールドをクリアした...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
C言語 エラーの原因がわからな...
-
#define _CRT_SECURE_NO_WARNIN...
-
最早開始時間と最遅完了時刻を...
-
【C++】関数ポインタの使い方
-
ラップ関数とはどんなものですか?
-
(int *)の意味
-
実数の整数部,小数部の取得
-
「{ } で囲むだけ」は正しい?
-
if と配列の組み合わせ
-
ColorをRGBで指定する方法
-
acceptをalarmでタイムアウトさ...
-
systemの戻り値を取得する方法
-
足して100になるような乱数のア...
-
PowerShellがうまくいかない
-
std::set<int> で、ある値が何...
-
C言語の配列をC++のvectorに高...
-
構造体の勉強中です 合計点の高...
おすすめ情報