여기서 파일 설명자 번호 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 라이브러리를 사용하는 것은 아니지만 모두 동등한 기능을 갖고 있으며 위의 논리는 여전히 적용됩니다.