Odczyt pliku -obsługa sygnałów - synchronizacja semaforami

0

Cześć, mam mały problem z odczytem pliku, ale najpierw pogląd na sytuacje. W programie są 3 procesy potomne i macierzysty (PM).
Procesy potomne wymieniają między sobą informacje za sprawą pamięci współdzielonej. W taki sposób, że proces 1.(P1) czyta linijka po linijce plik, każda przeczytana linia jest przesyłana do procesu 2. ( P2) gdzie zostaje policzona liczba znaków. Na końcu wynik jest przesyłany do procesu 3.(P3) i on wyświetla wynik.

Ponadto nałożona jest maska sygnałów tak, że jedynie proces 2. odbiera SIGTERM (ma kończyć program), SIGCONT ( kontyuować czytanie pliku, od miejsca w którym skończył), SIGTSTP (zatrzymuje czytanie pliku). Numer odebranego sygnału jest zapisywany do pipe'a między P2->PM oraz P2 wysyła sygnał SIGUSR1, aby pobudzić proces macierzysty do odczytu pipe'a. Następnie proces wysyła przez pipe'y numer otrzymanego sygnału do P1, P2 (tak wiem śmieszne, ale takie jest założenie...) i P3. Z tą różnicą że PM pobudza do odczytu tylko P1, natomiast P1 pobudza P2, a na końcu P2 pobudza P3.

Generalnie wszystko śmiga nawet zatrzymywanie i kontynuowanie programu, gdy proces 1. Czyta ze standardowego wejścia zamiast z pliku. W tym drugim przypadku otrzymuje błąd opuszczenia semafora, co mnie trochę dziwi, ponieważ pętla nadzorująca przebieg działań procesu 1. wykonuje polecenie semctl w celu sprawdzenia czy semafor jest podniesiony. Druga dziwniejsza rzecz, że jeżeli wstawię w pętli odczytującej semctl to faktycznie się nie odczytuje, czyli semafor faktycznie jest już opuszczony :O, ale zupełnie nie wiem dlaczego.

Ktoś ma pomysł jak odczytać plik linijka po linijce, żeby obsługa sygnału mu nie zaszkodził?

0

Bez kodu to rownie dobrze mozna wrozyc z fusow. Jezeli chodzi o czytanie standardowego wejscia przerywane sygnalem to mozesz sprawdzic czy np. read zwrocil EINTR i zrobic retry. Sprawdzanie stanu semafora semctl brzmi jak race condition.

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