質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

2625閲覧

select()で停止しない

torimingo

総合スコア122

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2019/03/24 06:44

select()でファイル記述子を監視しようとしているのですが、
ファイルによって(?)、select()で止まらないことがあります。

/dev/input/mouse0は、selectで正常に監視できますが
./a.txtは、selectで監視しようとすると、selectで止まってくれません。

以下にコードを示します。

#include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <fcntl.h> int main() { int fd; // ファイル記述子 struct timeval timeout; // タイムアウト用の構造体 fd_set readfds; // 監視するファイル記述子の集合 int maxfd; // selectに必要 int n; // 変化があったファイル記述子の数 //char *filename = "/dev/input/mouse0"; // 正常にselectが動作する char *filename = "./a.txt"; // selectで止まらず、無限ループしてしまう if((fd = open(filename, O_RDONLY)) < 0){ perror("open"); return 1; } maxfd = fd + 1; while(1){ FD_ZERO(&readfds); FD_SET(fd, &readfds); timeout.tv_sec = 3; timeout.tv_usec = 0; n = select(maxfd, &readfds, NULL, NULL, &timeout); // エラー if(n == -1){ perror("select"); return 1; } // データ到着 if(n > 0){ if(FD_ISSET(fd, &readfds)){ char buf[BUFSIZ]; int n; printf("%s ", filename); fflush(stdout); n = read(fd, buf, BUFSIZ); if ( n == -1 ) perror("isset"); write(1, buf, n); write(1, "\n", 1); } } // タイムアウト else{ printf("time out\n"); } } return 0; }

もし、ご存じの方がおりましたら、教えて頂けると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keicha_hrs

2019/03/24 07:21

これはどういう挙動を期待しているのでしょうか。プログラム開始時にはa.txtは存在していなくて、別プロセスによってa.txtが作られるところをselect()で捉えたい?・・・にしては、openが失敗した時点でプログラム終了させているからループにまで到達しないし。何をしたいのか全然わからない・・・。
torimingo

2019/03/24 07:27

select文に到達したら、a.txtを監視して(select文で止まって)、別プロセスでa.txtが変更されたら、select文以下が実行されるようにしたいです。プログラム開始時に、a.txtは存在しています。
keicha_hrs

2019/03/24 07:34 編集

select()ができるのは、ファイルディスクリプターが「読み込み可能になったか」どうかを検出することだけなので、「読み込み可能なa.txtが存在している」のなら常にselect()がパスしてしまうのは如何ともし難いでしょう。その機能をselect()で実現するのは無理ではないかと思います。
torimingo

2019/03/24 07:40

ご回答をありがとうございました。 select()について、根本的に間違った解釈をしていました。 URLを提示して頂いて、ありがとうございます。
keicha_hrs

2019/03/24 13:35

マウスのようなデバイスのI/Oや、ソケットプログラミングの送受信などにselect()を用いるのはまた事情が異なりますが、ローカルファイルのファイルディスクリプターを対象にした場合にはこういう動きになる、と解釈されるのが良いかと思います。
guest

回答1

0

ベストアンサー

ファイルが書き換えられた等のイベントを拾うには、inotifyを使います。
Man page of INOTIFY

投稿2019/03/24 08:38

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

torimingo

2019/03/24 09:38

ありがとうございます。 初めて知りました。 勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問