2016-06-27 6 views
0

У меня есть компьютер, в который записываются данные датчиков в 8 разных файлов. Я разработал программное обеспечение, которое позволяет копировать эти данные на другой компьютер при подключении двух компьютеров с использованием кабеля rj45.Используйте функцию выбора как на обычном диске.

После извлечения данных на моем компьютере мне нужно отправить их по строке каждого файла, используя псевдосериал (используя socat).

Я создал программу, которая использует вложенные для циклов, чтобы проверить, готовы ли данные во всех 8 файлах, а затем извлечь строку и отправить ее в puttySX.

Проблема в использовании ЦП. Способ уменьшить его, использует функцию блокировки, чтобы знать, готовы ли данные к чтению или нет, но есть ли какая-либо функция, например, выбор в сокетах или последовательных портах, но для таких файлов?

Если нет, что мне делать? Спасибо

+1

выбрать работу с файловыми дескрипторами в unix –

+0

@RichardHodges: Да, но для обычных файлов (то есть файлов на диске) он всегда возвращает «готов», поэтому он не очень полезен для этого приложения ... – psmears

+0

Да, он всегда возвращается в готовность с дисковыми файлами. На этом этапе я думаю, что я использую какой-то трюк, чтобы делать то, что хочу, как комбо inotify event, и файлы INI, если файлы создаются или нет ... – rmilville

ответ

0

Так,

я выкладываю, чтобы ответить на мой вопрос. Благодаря @yoones я нашел уловку для этого.

Когда файл журнала создается, я поставил логическое значение на верно в ини файле, глядя, как этот

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

Другая программа использует Inotify для обнаружения создания и изменения в соответствующих файлах. После некоторого изменения он считывает ini-файл, обрабатывает данные, и когда он заканчивает читать данные, он удаляет файл журнала и записывает ложь в ini-файл в соответствующей строке.

Поскольку я должен обрабатывать несколько файлов журнала в одно и то же время, каждый раз, когда я читаю строку, я проверяю свой ini-файл, чтобы узнать, нужно ли мне начинать обработку другого файла журнала, поэтому я могу запустить несколько процессов в в то же время.

Я сделал бесконечный цикл while, поэтому, когда все процессы завершены, программа возвращается к выбранному вызову, ожидая некоторых изменений и не потребляя все ресурсы ЦП.

Прошу прощения, если я не настолько ясен, английский не мой родной язык.

Спасибо всем за ответы и комментарии.

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

 Смежные вопросы

  • Нет связанных вопросов^_^