2016-06-27 41 views
0

我有一臺計算機,它將一些傳感器數據記錄到8個不同的文件中。 我開發了一個軟件,當您使用rj45電纜連接兩臺機器時,您可以將此數據複製到另一臺計算機。在常規磁盤文件上使用select like函數

在我的計算機上檢索數據後,我需要使用僞序列(使用socat)逐行發送它。

我創建了一個程序,它使用嵌套for循環來檢查所有8個文件中的數據是否準備就緒,然後提取一行並將其發送到puttySX。

問題是CPU使用率。一種減少它的方法是使用阻塞函數來知道數據是否準備好讀取或不存在,但有沒有像在套接字或串行端口上選擇的功能,但對於這樣的文件?

如果不是,我該怎麼辦?謝謝

+1

選擇作品在UNIX文件描述符 –

+0

@RichardHodges:是的,但對於普通文件(即磁盤上的文件),它總是返回「準備」,所以它不是非常有用此應用程序... – psmears

+0

呀它總是返回準備與磁盤文件。在這一點上,我想我會用一些技巧來做我想要的事情,比如inotify事件和INI文件的組合,如果文件被創建或者不存在,... – rmilville

回答

0

所以,

我張貼回答我的問題。感謝@yoones,我發現了一些技巧來做到這一點。

當創建一個日誌文件,我設置真布爾的ini文件看起來像這樣

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

另一個程序使用的inotify來檢測相應的文件創建和修改。一旦發生了一些變化,就會讀取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