Strace - 파일 설명자 3

Strace - 파일 설명자 3

여기서 파일 설명자 번호 3이 무엇을 의미하는지 잘 모르겠습니다. 이 설명자는 datlog.txt 파일을 얻기 위한 하드 드라이브 연결을 가리키는 일종의 포인터입니까? 나는 서브루틴 close()가 이 정수를 코드의 매개변수로 취하기 때문에 그렇게 생각합니다. 아니면 설명자가 파일이 저장된 메모리의 버퍼를 가리키나요?

 open("datalog.txt", O_RDONLY)              = 3
 read(3, "Hello World!!!!!!\n", 250)     = 18
 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 3), ...}) = 0
 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,   0) = 0x7f3f71a10000
 write(1, "Read Hello World!!!!!!\n", 23) = 23
 write(1, "\n", 1)                       = 1
 close(3)                                = 0
 exit_group(0)                           = ?
 +++ exited with 0 +++

답변1

스트레스 쇼시스템 호출, 이는 GNU/Linux의 C 함수입니다. 이는 기본 C 라이브러리에 의해 게시되며 모든 실행 프로세스는 어떤 방식으로든 이를 사용해야 합니다. 실제 C 코드는 이를 직접 호출하거나 일반적으로 시스템 호출 자체에 매우 직접적으로 대응하는 API 래퍼 함수를 ​​사용할 수 있습니다.

이는 서명이 일반적으로 동일하기 때문에 해당 API 함수에 대한 문서를 보면 대부분의 시스템 호출을 해독할 수 있음을 의미합니다. 예를 들어:

open("datalog.txt", O_RDONLY)

다음은 All System Calls 1 매뉴얼의 섹션 2 open()에 있는 GNU C 서명입니다 .man 2 open

int open(const char *pathname, int flags);

C를 사용하지 않으면 문자열 경로, 정수 플래그(이 경우 읽기 전용을 의미 O_RDONLY)를 사용하고 정수를 반환합니다.

정수는파일 설명자다른 낮은 수준의 C 입력/출력 기능과 함께 사용됩니다. 예를 들어 read()Strace는 이 경우 다음 값을 표시합니다 =.open(). 이것은 POSIX/GNU C 서명입니다 read():

ssize_t read(int fd, void *buf, size_t count);

첫 번째 매개변수는 정수 파일 설명자입니다.


1. "시스템 호출"이라는 용어는 일반적으로 동일하기 때문에 실제 시스템 호출이나 라이브러리의 API 래퍼 함수를 ​​막연하게 나타냅니다. 섹션 2는 실제로 후자에 대한 문서입니다. 기술적으로는 GNU API이지만 다음과 동일하지는 않습니다.POSIX, 공식 문서도 있습니다. 예를 들어,이것은open(). 모든 *nix 시스템이 GNU C 라이브러리를 사용하는 것은 아니지만 모두 동등한 기능을 갖고 있으며 위의 논리는 여전히 적용됩니다.

관련 정보