table of contents
other languages
other sections
ACCEPT(2) | Podręcznik programisty Linuksa | ACCEPT(2) |
NAZWA¶
accept - przyjmowanie połączenia na gnieździeSKŁADNIA¶
#include <sys/types.h>OPIS¶
Uwaga! To tłumaczenie może być nieaktualne!UWAGI¶
Nie zawsze po dostarczeniu SIGIO musi istnieć oczekujące połączenie. To samo dotyczy select(2) i poll(2), zwracających zdarzenie odczytywalności, ponieważ połączenie mogło zostać usunięte przez asynchroniczny błąd sieci lub inny wątek, przed wywołaniem accept. Jeśli to się zdarzy, to wywołanie będzie blokować, oczekując następnego połączenia. Aby upewnić się, że accept nigdy nie będzie blokowało, s powinno mieć ustawiony znacznik O_NONBLOCK (zobacz socket(7)).WARTOŚĆ ZWRACANA¶
Wywołanie w przypadku błędu zwraca -1. Gdy zakończy sie pomyślnie zwraca nieujemną liczbę całkowitą, która jest deskryptorem przyjętego gniazda.OBSŁUGA BŁĘDÓW¶
Linuksowe accept przekazuje zalegające już na nowym gnieździe błędy sieciowe jako kod błędu z accept. Zachowanie to różni się od implementacji gniazd w BSD. Dla sensownego działania, aplikacja powinna wykrywać po wykonaniu accept błędy sieciowe, zdefiniowane dla danego protokołu i traktować je jak EAGAIN, czyli ponawiać próbę. W wypadku TCP/IP są to ENETDOWN, EPROTO, ENOPROTOOPT, EHOSTDOWN, ENONET, EHOSTUNREACH, EOPNOTSUPP i ENETUNREACH.BŁĘDY¶
Funkcja accept musi zakończyć się niepomyślnie gdy:- EAGAIN lub EWOULDBLOCK
- Gniazdo jest zaznaczone jako nieblokujące a brak jest połączeń, które mogłyby zostać przyjęte.
- EBADF
- Deskryptor jest nieprawidłowy.
- ENOTSOCK
- Deskryptor odnosi się do pliku, zamiast do gniazda.
- EOPNOTSUPP
- Przekazane gniazdo nie jest typu SOCK_STREAM.
- EINTR
- Funkcja systemowa została przerwana wskutek odebrania sygnału przed prawidłowym nawiązaniem połączenia.
- ECONNABORTED
- Połączenie zostało przerwane.
- EINVAL
- Gniazdo nie nasłuchuje połączeń.
- EMFILE
- Osiągnięte zostało ograniczenie liczby otwartych deskryptorów plików dla procesu.
- ENFILE
- Osiągnięte zostało systemowe ograniczenie liczby otwartych deskryptorów plików.
- EFAULT
- Parametr addr nie znajduje się w przestrzeni adresowej dostępnej do zapisu dla użytkownika.
- ENOBUFS, ENOMEM
- Jest niedostateczna ilość wolnej pamięci. Oznacza to zazwyczaj, że istnieje ograniczenie dla przydzielania pamięci na bufory gniazd, nie zaś że zabrakło pamięci w systemie.
- EPROTO
- Wystąpił błąd protokołu.
- EPERM
- Reguły firewalla zabraniają połączenia.
- Dodatkowo, dla nowego gniazda mogą być zwracane błędy sieciowe zdefiniowane
- dla danego protokołu. Różne jądra Linuksa mogą zwracać inne błędy, takie jak ENOSR, ESOCKTNOSUPPORT, EPROTONOSUPPORT, ETIMEDOUT. Wartość ERESTARTSYS może być obserwowana podczas śledzenia.
ZGODNE Z¶
SVr4, 4.4BSD (funkcja accept pojawiła się pierwotnie w BSD 4.2). Strona podręcznika BSD opisuje pięć możliwych zwracanych błędów (EBADF, ENOTSOCK, EOPNOTSUPP, EWOULDBLOCK, EFAULT). SUSv3 opisuje błędy EAGAIN, EBADF, ECONNABORTED, EINTR, EINVAL, EMFILE, ENFILE, ENOBUFS, ENOMEM, ENOTSOCK, EOPNOTSUPP, EPROTO, EWOULDBLOCK. SUSv2 opisuje dodatkowo błędy EFAULT i ENOSR. Linuksowe accept _nie_ dziedziczy znaczników gniazda, takich jak O_NONBLOCK. Takie zachowanie różni się od innych implementacji gniazd BSD. Przenośne programy nie powinny zakładać takiego zachowania i zawsze ustawiać dla gniazda zwracanego przez accept wszystkie potrzebne znaczniki.UWAGA¶
Trzeci argument accept był pierwotnie zadeklarowany jako `int *' (i jest pod libc4 i libc5 oraz na wielu innych systemach, takich jak BSD 4.*, SunOS 4, SGI); W szkicu standardu POSIX 1003.1g chciano to zmienić na `size_t *' i tak jest w SunOS 5. Późniejsze szkice POSIX używają tu `socklen_t *' i tak samo robią Single Unix Specification i glibc2. Cytując Linusa Torvaldsa: _Any_ sane library _must_ have "socklen_t" be the same size as int. Anything else breaks any BSD socket layer stuff. POSIX initially _did_ make it a size_t, and I (and hopefully others, but obviously not too many) complained to them very loudly indeed. Making it a size_t is completely broken, exactly because size_t very seldom is the same size as "int" on 64-bit architectures, for example. And it _has_ to be the same size as "int" because that's what the BSD socket interface is. Anyway, the POSIX people eventually got a clue, and created "socklen_t". They shouldn't have touched it in the first place, but once they did they felt it had to have a named type for some unfathomable reason (probably somebody didn't like losing face over having done the original stupid thing, so they silently just renamed their blunder).ZOBACZ TAKŻE¶
bind(2), connect(2), listen(2), select(2), socket(2)INFORMACJE O TŁUMACZENIU¶
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu Tłumaczenia Manuali i może nie być aktualne. W razie zauważenia różnic między powyższym opisem a rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o zapoznanie się z oryginalną (angielską) wersją strony podręcznika za pomocą polecenia:- man --locale=C 2 accept
2002-04-23 | Linux 2.2 |