2012-05-10 21 views
6

Mam pewien kod, który wywołuje okresowo recv() (z flagą MSG_DONTWAIT). Jestem ciekawy, ponieważ profilowanie mojego kodu w vnune, widzę wywołanie sigprocmask() powiązane z recv() i zajmuje ono dużą część całkowitego czasu wykonania. Jestem ciekawy, dlaczego recv() dzwoni sigprocmask().Dlaczego funkcja sigprocmask jest wywoływana podczas wywoływania wywołania systemowego recv?

+0

Czy widzimy odpowiedni ślad najmniejszego możliwego kodu, który odtwarza to zachowanie? Czy widzimy też ten kod demo? Byłoby pouczające, aby zobaczyć dokładnie, co robi się z maską sygnału. – pilcrow

+0

Czy mógłbyś rozwinąć kontekst tych wywołań do 'recv()'? Jakiego rodzaju gniazda używasz? Czy nazywasz 'recv()' bezpośrednio? – alk

Odpowiedz

0

Prawdopodobnie tak recv może stwierdzić, czy generowane są odpowiednie sygnały, które w przeciwnym razie nie byłyby widoczne, gdyby te sygnały były zablokowane. EAGAIN/EWOULDBLOCK przychodzą na myśl jako wartości errno, które czasami są generowane z wykorzystaniem sygnałów, które mogą być blokowane. Czy spojrzałeś na sigprocmask man page?

+1

EAGAIN to kod błędu, a nie sygnał. – pilcrow

+0

Brainfart, miałem na myśli błędy. Dzięki. Błąd jest czasem generowany na podstawie obsługiwanych sygnałów. – JimR

1

Podczas pracy z gniazdem TCP pod Linuksem, otrzymasz SIGPIPE, jeśli druga strona zostanie nieoczekiwanie zamknięta.

Ponieważ możesz maskować ten sygnał (przez większość czasu będziesz obsługiwał wartość zwrotną 0 siebie, nie przejmujesz się tym sygnałem), I domyslna biblioteka systemowa sprawdza stan sygnału, i jeśli jest zamaskowany, użyj szybszej ścieżki kodu.

Jeśli nie, nie może zoptymalizować.

BTW, wiesz o pselect() prawda?

Powiązane problemy