2010-08-13 5 views
9

read (2)와 write (2)는 소켓 디스크립터와 파일 디스크립터 모두에서 작동합니다. 파일 기술자의 경우, 사용자 파일 기술자 테이블 -> 파일 테이블과 마지막으로 파일 형식 (정규 파일/char/블록)을 검사하는 inode 테이블로 이동하여 그에 따라 읽습니다. char spl 파일의 경우 char 장치 스위치의 파일의 주요 번호를 기반으로 함수 포인터를 가져오고 해당 장치에 대해 등록 된 적절한 읽기/쓰기 루틴을 호출합니다. 마찬가지로 블록 장치 스위치에서 함수 포인터를 가져 와서 블록 특수 파일에 대해 적절한 읽기/쓰기 루틴이 호출됩니다.소켓 디스크립터와 파일 디스크립터

소켓 디스크립터에서 읽기/쓰기가 수행 될 때 어떤 일이 발생하는지 알려 주시기 바랍니다. read/write가 소켓 디스크립터에서 작동한다면, 소켓 대신 open을 사용하여 디스크립터를 얻을 수 없다.

+0

당신을 말할 수 없다 ** 정확 ** (당신이 정말로 알고 싶다면 커널 소스에서 찾고 시도)하지만, 본질적으로는 통과 할 것이다 무슨 일 네트워크 인터페이스 카드 용 드라이버에 도달 할 때까지 네트워크 스택 아래로 전달할 TCP 드라이버에 대한 요청. 네트워크 스택의 각 계층이 일반적으로하는 일을 알고 싶다면 * OSI 모델 *을 찾으십시오. 'open'과'socket'의 경우 : 파일이나 소켓을 열지 여부에 따라 지정해야하는 정보가 다르므로 다른 인수를 사용합니다. – David

+0

socket()을 호출 할 때 할당 된 데이터 구조, i 노드 테이블에 저장된 정보, 결국 네트워크 인터페이스 카드 드라이버 루틴에 도달하는 방법을 알고 싶습니다. –

+0

읽기/쓰기는 시스템 호출을 감 쌉니다. 대부분의 작업은 커널 공간에서 수행됩니다. 그 추상화의 종류, 또는 "가상화": 그냥 블록 파일, 소켓, 또는 다른 많은 것들을 "파일"로 가져 가라. 파일에는 읽기, 쓰기, 열기 등과 같은 조작이 있습니다. 그러나 소켓 읽기 또는 디스크 파일 읽기의 실제 구현은 커널에 정의되어 있습니다. 필요한 경우 "write"를 정의하여 파일에서 읽을 수도 있습니다. – tristan

답변

2

소켓 설명자도 파일 구조와 연관되어 있지만 해당 구조에 대한 file_operations 함수 세트는 평소와 다릅니다. 따라서 이러한 디스크립터의 초기화 및 사용은 서로 다릅니다. 커널 레벨 인터페이스의 일부분을 읽고 쓰는 것은 정확히 똑같은 일이 일어났습니다.

+0

나는 socket()을 호출 할 때 할당 된 데이터 구조가 무엇인지 알고 싶다. 어떤 정보가 inode 테이블에 저장되어 있는지, 결국은 네트워크 인터페이스 카드 드라이버 루틴에 어떻게 도달하는지 알기를 원한다. –

+0

은 의도적으로 동일하게 만들어졌다. – Yerken

0

일부 상태에서는 일부 유형의 소켓에 대해 읽기 및 쓰기가 유효합니다. 이것은 모두 커널 내부에서 전달되는 다양한 구조체에 달려있다.

원칙적으로 open()은 소켓 디스크립터를 만들 수 있지만 BSD 소켓 API는 그런 식으로 정의 된 적이 없습니다.

open() 이외의 시스템 호출 (예 : epoll_create 또는 timerfd_create)에 의해 열리는 파일 설명 자의 일부 (일부 Linux 특정) 유형이 있습니다. 이것들은 똑같이 작동합니다.

6

메모리에서 알 수 있듯이 파일 디스크립터는이 fd의 파일 시스템 유형을 식별하는 플래그를 포함합니다. 커널은 파일 시스템 유형에 따라 해당 핸들러 함수를 호출합니다. 리눅스 커널에서 read_write.c 소스를 볼 수 있습니다.

이 간략하게 이야기하기 위해, 커널이 한 :

읽기 write.c에서
  1. 가하는 file_system_wrapper 기능이 호출 해당하는 핸들러 함수가 FD의 파일 형식에 따라이 (EXT2/EXT3/소켓/..)
  2. socket.c에는 socket_type_wrapper 함수가 있습니다. 대응하는 소켓 핸들러 함수를 호출하는 함수는 소켓의 타입에 의존한다 (ipv4, ipv6, atm others)
  3. socket_ipv4.c에는 protocol_type 래퍼 함수가있다. 해당 프로토콜 핸들러 함수를 호출하는 프로토콜은 tpye (udp/tcp) 프로토콜에 따라 다릅니다.
  4. In tcp_ip4.c; tcp_sendmsg가 있으며이 함수는 tcp ipv4 type의 FD에 쓸 때 호출됩니다.

희망이 명확하게, 감사 Houcheng

관련 문제