2016-06-27 3 views
0

センサーデータを8種類のファイルに記録するコンピュータがあります。 rj45ケーブルを使用して2台のマシンを接続するときに、このデータを別のコンピュータにコピーできるソフトウェアを開発しました。通常のディスクファイルでselect like関数を使用

私のコンピュータでデータを取得した後、疑似シリアル(socatを使用)を使って各ファイルの行ごとに1行ずつ送信する必要があります。

ネストされたforループを使用して、8つのファイルすべてにデータが準備されているかどうかをチェックしてから、行を抽出してputtySXに送信するプログラムを作成しました。

CPU使用率に問題があります。それを減らす方法は、データが読み込めるかどうかを知るためにブロッキング機能を使用していますが、ソケットやシリアルポートで選択するような機能はありますか?

いいえ、どうすればよいですか?ありがとう

+1

selectはUNIXのファイル記述子で動作します –

+0

@RichardHodges:はい、通常のファイル(つまりディスク上のファイル)の場合、常に "ready"を返すので、このアプリケーションではあまり役に立ちません。 – psmears

+0

ディスクファイル。この時点で、私は、私がinotifyイベントとINIファイルのコンボのように、ファイルが作成されているかどうかを保存するためにいくつかのトリックを使用すると思います... – rmilville

答えて

0

ので、

私は私の質問に答えることを投稿してください。 @yoonesのおかげで、私はこれを行うためのいくつかのトリックを見つけました。ログファイルが作成され

、私は別のプログラムが対応するファイルで作成および変更を検出するためのinotifyを使用しています。この

[CreatedFiles] 
cli1=false 
cli2=false 
cli3=false 
cli4=false 
cli5=false 
cli6=false 
cli7=false 
cli8=false 

ように見えるのiniファイルでtrueにブール値を設定します。変更が行われると、iniファイルを読み込み、データを処理し、データの読み込みが完了すると、ログファイルを削除し、対応する行のiniファイルにfalseを書き込みます。

同じ時刻に複数のログファイルを処理する必要があるため、行を読み込むたびに、別のログファイルを処理する必要があるかどうかを確認するためにiniファイルを確認します。同じ時間。

私は無限のループを行いました。すべてのプロセスが完了すると、プログラムはselect呼び出しに戻り、変更を待ってすべてのCPUリソースを消費しません。

私はあまり明確でない場合は申し訳ありませんが、英語は母国語ではありません。

ご返信いただきありがとうございます。

0

inotifyを見ると、ファイルシステムイベントを監視できます。ここで

(これは、生産コードではありません)あなたが始めるためのサンプルコードです:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/inotify.h> 

#define BUF_LEN (sizeof(struct inotify_event) * 1) 

int main(int argc, char *argv[]) 
{ 
    char *filepath; 
    int fd, wd; 
    struct inotify_event *event; 
    char buf[BUF_LEN]; 
    ssize_t ret; 

    if (argc != 2) 
    { 
     fprintf(stderr, "Usage: ./%s <filepath>\n", argv[0]); 
     return (EXIT_FAILURE); 
    } 
    filepath = argv[1]; 

    /* Initialization */ 
    fd = inotify_init(); 
    if (fd == -1) 
    { 
     perror("inotify_init()"); 
     return (EXIT_FAILURE); 
    } 

    /* Specify which file to monitor */ 
    wd = inotify_add_watch(fd, filepath, IN_MODIFY); 
    if (wd == -1) 
    { 
     perror("inotify_add_watch"); 
     close(fd); 
     return (EXIT_FAILURE); 
    } 

    /* Wait for that file to be modified, */ 
    /* and print a notification each time it does */ 
    for (;;) 
    { 
     ret = read(fd, buf, BUF_LEN); 
     if (ret < 1) 
     { 
      perror("read()"); 
      close(fd); 
      return (EXIT_FAILURE); 
     } 
     event = (struct inotify_event *)buf; 
     if (event->mask & IN_MODIFY) 
     printf("File modified!\n"); 
    } 
    close(fd); 
    return(EXIT_SUCCESS); 
} 
+0

ええ、しかし、inotifyはイベントを開始する必要があります。私が見たことから、 "FILE_NOT_EMPTY"というようなイベントはありません。 私は今、いくつかのトリックをしようとしています、私はいくつかの結果があれば投稿します。 – rmilville

+0

私はIN_MODIFYがうまく仕事をするべきだと思います。 – yoones

関連する問題