2010-08-13 17 views
9

odczyt (2) i zapis (2) działają zarówno na deskryptorze gniazda, jak i deskryptorze pliku. W przypadku deskryptora pliku, tabeli deskryptorów plików użytkownika-> tabeli plików, a na końcu do tabeli i-węzłów, w której sprawdza typ pliku (zwykły plik/znak/blok) i odpowiednio czyta. W przypadku pliku char-spl pobiera wskaźniki funkcji w oparciu o główny numer pliku z przełącznika urządzenia char i wywołuje odpowiednie procedury odczytu/zapisu zarejestrowane dla tego urządzenia. Podobnie stosowna procedura odczytu/zapisu jest wywoływana dla pliku specjalnego bloku, pobierając wskaźniki funkcji z przełącznika urządzenia blokowego.deskryptor gniazda vs deskryptor pliku

Czy mógłbyś proszę dać mi znać, co się dzieje podczas odczytu/zapisu na deskryptorze gniazda. Jeśli odczyt/zapis działa na deskryptorze gniazda, nie możemy użyć deskryptora open zamiast socket'a?

+0

Nie można powiedzieć ** ** dokładnie, co się dzieje (spróbuj poszukać u źródła jądra, jeśli naprawdę chcesz wiedzieć), ale zasadniczo to minie wniosek do sterownika TCP, który przekaże go dalej w dół stosu sieciowego, aż dotrze do sterownika karty sieciowej. Jeśli chcesz wiedzieć, co każda warstwa stosu sieciowego ma w ogóle, spójrz na model * OSI *. Jeśli chodzi o 'open' vs' socket': przyjmują różne argumenty, ponieważ informacje, które należy podać, różnią się w zależności od tego, czy chcesz otworzyć plik, czy gniazdo. – David

+0

Chcę wiedzieć, jaka jest struktura danych przydzielona na wywołanie socket(), jakie informacje są przechowywane w tabeli i-węzłów, w jaki sposób w końcu sięga ona do podprogramów sterownika karty sieciowej podczas wywoływania odczytu/zapisu –

+0

Uwaga: odczytywanie/zapisywanie wywołania systemowego. Większość zadań jest wykonywana w przestrzeni jądra. to rodzaj abstrakcji, czyli "wirtualizacja": po prostu weź plik blokowy, gniazdo lub wiele innych rzeczy, jako "plik". plik ma operacje takie jak: odczyt, zapis, otwarcie itd. Ale prawdziwa implementacja odczytu gniazda lub odczytywania pliku dysku jest zdefiniowana w jądrze. Możesz nawet zdefiniować "zapis" do odczytu z pliku, jeśli potrzebujesz. – tristan

Odpowiedz

2

Deskryptory gniazd są również powiązane ze strukturami plików, ale zbiór funkcji operacji file_operations dla tych struktur różni się od zwykłego. Inicjalizacja i użycie tych deskryptorów są zatem różne. Odczytywanie i zapisywanie części interfejsu na poziomie jądra okazało się dokładnie równoważne.

+0

Chcę wiedzieć, jaka jest struktura danych przydzielona na wywołanie socket(), jakie informacje są przechowywane w tabeli i-węzłów, w jaki sposób w końcu sięga ona do podprogramów sterownika karty sieciowej podczas wywoływania odczytu/zapisu –

+0

nie stało się, raczej celowo wykonane tak, aby były identyczne – Yerken

0

Odczyt i zapis odnoszą się do niektórych typów gniazd w niektórych stanach; wszystko zależy od różnych struktur, które są przekazywane wewnątrz jądra.

W zasadzie metoda open() może utworzyć deskryptor gniazda, ale interfejs API gniazd BSD nigdy nie został zdefiniowany w ten sposób.

Istnieje kilka typów deskryptorów plików, które są otwierane przez wywołania systemowe inne niż open(), na przykład epoll_create lub timerfd_create. Działają tak samo.

6

Jak wiem w pamięci, deskryptor pliku będzie zawierał flagę identyfikującą typ systemu plików tego fd. Jądro wywoła odpowiednią funkcję obsługi zależy od typu systemu plików. Możesz zobaczyć źródło read_write.c w jądrze Linux.

Aby mówić w skrócie, jądro zrobił:

  1. W odczytu write.c, istnieje funkcja file_system_wrapper, że wezwanie odpowiada funkcja obsługi zależy FD typu plików (ext2/ext3/gniazda/..)
  2. W socket.c znajduje się funkcja socket_type_wrapper; która wywołuje odpowiednią funkcję obsługi wtyków zależy od typu gniazda (ipv4, ipv6, atm inne)
  3. W socket_ipv4.c znajduje się funkcja opakowująca protocol_type; która wywołuje odpowiednią funkcję obsługi protokołu zależy od protokołu tpye (udp/tcp)
  4. W tcp_ip4.c; istnieje tcp_sendmsg i funkcja ta byłaby wywoływana podczas zapisu do FD typu tcp ipv4.

Nadzieja to wyraźnie, dzięki, Houcheng

Powiązane problemy