2016-10-11 50 views
5

Pracuję z wieloma procesami i sygnałami i właśnie dowiedziałem się wczoraj, że printf nie jest funkcją ponownego wejścia, więc istnieje ryzyko, używając go z procedurami obsługi sygnałów. Czy mogę coś z tym zrobić? Czy istnieje jakaś odmiana printf lub jakikolwiek inny system, który mógłby zastąpić printf?Używanie printf jako funkcji ponownego wejścia C

Dzięki!

+1

Sprawdź tę odpowiedź, aby uzyskać szczegółowe wyjaśnienie: http://stackoverflow.com/questions/3941271/why-are-malloc-and-printf-said-as-non-reentrant – bruceg

+1

Zastanawiasz się, dlaczego chcesz włączyć mając dwa lub więcej procesów zapisanych w tym samym czasie. WaHrAeT yAoRuE cYoOmUtTlHeItNeKlIyN Gm? Ad? – Tibrogargan

+0

'write' jest async-safe, więc może być użyte z obsługi sygnału ... –

Odpowiedz

4

Obsługa sygnałów jest ogólnie bardzo trudna. Tak bardzo trudne, że zwykle jedyną bezpieczną operacją w ich obrębie jest ustawienie sygnału "otrzymanego sygnału", a następnie pozostawienie pętli głównej (lub w aplikacji z wieloma gwintami specjalnego wątku obsługi sygnału) programu obsługa.

+0

Jeśli ustawiam tylko flagę (jak statyczną zmienną) w moim programie obsługi sygnału, to kiedy mój kod powróci do printf, wydrukuje resztę wiadomości? Jeśli tak, dlaczego tak się dzieje? –

+1

Obsługa sygnału przerywa wszystko, co się dzieje. Jeśli przerwany printf jest aktualnie w systemie operacyjnym, jądro zazwyczaj przerywa działanie (to znaczy resetuje wszystko z powrotem w stanie przed wywołaniem funkcji syscall) i zwraca z errno ustawionym na ERESTART (przerwane wywołanie systemowe powinno zostać ponownie uruchomione). Funkcje biblioteczne, takie jak printf, po prostu zwrócą ten błąd (tzn. Zwracają wartość -1 i pozostawiają errno bez zmian). Jeśli funkcja nie znajduje się w systemie, po prostu będzie kontynuowana, gdy funkcja obsługi sygnału powróci i jedynym sposobem na wykrycie wystąpienia sygnału jest sprawdzenie flagi. –

+0

Rozumiem. Więc jak mogę użyć mojej flagi, aby ponownie uruchomić printf, jeśli jest przerwany przez sygnał z jądra? –