deskryptor gniazda a deskryptor pliku


read (2) i write (2) działają zarówno na deskryptorze gniazda, jak i deskryptorze pliku. W przypadku deskryptora pliku tablicą deskryptorów plików użytkownika jest tablica plików & >, a na końcu tablica i-węzłów, w której sprawdza typ pliku (normalny plik/znak/blok) i odpowiednio odczytuje. W przypadku pliku char spl, uzyskuje wskaźniki funkcji na podstawie numeru głównego pliku z char przełącznika urządzenia i wywołuje odpowiednie procedury odczytu/zapisu zarejestrowane dla urządzenia.
Podobnie, odpowiednia procedura odczytu/zapisu jest wywoływana w bloku specjalnego pliku przez uzyskanie wskaźników funkcji z przełącznika urządzenia blokowego.
Czy mógłbyś dać mi znać, co dokładnie się dzieje, gdy odczyt/zapis jest wywoływany przez deskryptor gniazda. Jeśli odczyt/zapis działa na deskryptorze gniazda, czy nie możemy użyć open zamiast socket, aby uzyskać deskryptor?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jak wiem z pamięci, deskryptor pliku będzie zawierał flagę identyfikującą typ systemu plików tego fd. jądro wywoła odpowiednią funkcję obsługi w zależności od typu systemu plików. Możesz zobaczyć źródło pliku read_write.c w jądrze Linuksa.
Krótko mówiąc, jądro właśnie to zrobiło:
  • W read-write.c znajduje się funkcja file_system_wrapper, która wywołuje odpowiednią funkcję obsługi w zależności od typu pliku fd (ext2/ext3/socket/..)
  • Socket.c ma funkcję socket_type_wrapper; który wywołuje odpowiednią funkcję obsługi gniazda w zależności od typu gniazda (ipv4, ipv6 i inne)
  • Socket_ipv4.c ma funkcję opakowującą protokół_type, która wywołuje odpowiednią funkcję obsługi protokołu w zależności od protokołu tpye (udp/tcp)
  • W tcp_ip4.c; jest tcp_sendmsg i ta funkcja zostanie wywołana podczas zapisu do FD typu tcp ipv4.

Mam nadzieję, że to jasne
podziękować,
Hocheng
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Deskryptory gniazd są również powiązane ze strukturami plików, ale zestaw funkcji file_operations dla tych struktur różni się od zwykłego. Dlatego inicjalizacja i użycie tych deskryptorów są różne. Czytanie i pisanie części interfejsu na poziomie jądra okazało się dokładnie równoważne.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

czytanie i pisanie są dozwolone dla niektórych typów gniazd w niektórych stanach; wszystko zależy od różnych struktur, które są przekazywane wewnątrz jądra.
Zasadniczo open () może utworzyć deskryptor gniazda, ale funkcja API gniazda BSD nigdy nie została zdefiniowana w ten sposób.
Istnieją inne (nieco specyficzne dla Linuksa) typy deskryptorów plików, które są otwierane przez wywołania systemowe inne niż open (), takie jak epoll_create lub timerfd_create. Działają w ten sam sposób.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się