Komunikacja przez wirtualny plik - Linux

0

Witam,

Potrzebuję w jakiś sposób przekazać dane z rs232 do programu Octave. Niestety pakiety w pewien sposób trzeba przefiltrować i zdekodować.
Aktualnie robię to w Octave poprzez otwarcie i czytanie np. /dev/ttyUSB0. Problem z pobieraniem w danym czasie odpowiednich pakietów i sama obróbka. Przy większej ilości danych(są też w tym niepotrzebne pakiety) program Octave się nie wyrabia.
Pomyślałem o takim motywie:
Program w C odbiera dane i odpowiednie pomiary "zapisuje" do danych plików. Skrypt w Octave otwiera odpowiednie pliki i pobiera pomiar.
Można to zrobić korzystając z kolejki FIFO (mkfifo), lecz dane pomiary mają różną częstotliwość próbkowania i nie chciałbym przez Octave pobierać wszystkiego - wiązałoby się to też ze zrobieniem wielowątkowości skryptu.

Z napisaniem programu w C nie ma problemu, tylko jak to ugryźć?
Najlepiej byłoby, aby wykonała się funkcja w programie przy próbie odczytu wartości z pliku przez inny program zewnętrzny.
Kiedyś robiłem coś takiego, tylko program musiał być modułem systemowym. Da się taki plik utworzyć poprzez "zwykły" program(oczywiście bez ingerencji dysku)?

System operacyjny: Linux
Środowisko do symulacji: Octave

0

Chyba wykorzystam kolejkę fifo(plik stworzony przez mkfifo). Problem mam ze sprawdzeniem czy ktoś go czyta.
Idea: Główny program gromadzi dane do tablicy, a w wątku wpisuje do pliku fifo.
Przykładowy program związany tylko z plikiem fifo:

int main(){
  int fd = open("fifo_test", O_WRONLY);
  for(;;){
    // sprawdzenie czy ktoś czyta ?
    // ...
    write(fd, "OK\n", 3);
    perror("test");
    sleep(1);
  }	
  return 0;
}

Mam 2 problemy...

  1. Odpalam program a w konsoli czytam:
cat fifo_test

Po zakończeniu czytania(Ctrl+C) główny program też jest zabijany. Jak tego uniknąć? Tak, aby kolejna próba odczytania pliku dawała dane "wysyłane" z programu.

  1. Jak sprawdzić czy "ktoś" czyta plik?
    Potrzebuję zrobić możliwość takiego "flush'a", aby nie czytać starych danych zgromadzonych w pamięci programu. Np. przez inny plik fifo, wysyłam z zewnętrznego programu pewne komunikaty, np. żeby wyczyścić dane i zacząć pobierać aktualne. W tym wypadku funkcja write nie może czekać aż wyśle dane. Jeśli będzie sprawdzała czy ktoś "czyta" a ten "ktoś" początkowo informuje żeby wyczyścić dane a następnie do funkcji write trafiają nowe dane.

Kombinowałem z flagą O_NONBLOCK, lecz pojawia się dodatkowy problem. Jeśli w programie otworzę plik (O_WRONLY | O_NONBLOCK), a dopiero później zacznę czytać plik, w programie dostaje cały czas "test: Bad file descriptor" i pojawiający się "klient" nic nie dostaje. Oczywiście klienci czytający pojawiają się i znikają, tak więc program musi być na to przygotowany(synchronizacja i sprawdzanie czy ktoś czyta).

1

Może zastanów się czemu "program Octave się nie wyrabia", bo najprawdopodobniej to jest źródło problemu, a nie nadmiar danych.

0

Pakiety danych przychodzą mi w różnej kolejności i synchronizuje je na podstawie wybranego strumienia danych.
W octave musiałbym odpalić wielowątkowość, co jest tam bardzo upierdliwe. Wolałbym, aby program konsolowy w C, obrobił i posortował dane.

1 użytkowników online, w tym zalogowanych: 0, gości: 1