나는 시스템 호출을 기록할 수 있는 "strace"와 유사한 프로그램을 만들었습니다.
또한 웹 서버를 설치하고 "strace"와 내 프로그램의 시스템 호출을 관찰하고 비교했습니다.
각 프로그램에 대해 웹 서버에 간단한 HTTP GET 요청을 보내 여러 시스템 호출을 생성합니다.
내 프로그램에서:
나는 특정 accept4() 실행에서 반환 값이 (-11)이라는 것을 알았습니다. 이는 (마이너스 11)을 의미합니다!
그러나 accept4()의 (-11) 반환 값은 절대 발생해서는 안 됩니다.
accept4() 시스템 호출이 종료될 때 RAX 레지스터에 (-11)이 표시되는 이유를 이해할 수 없습니다.
첨부된 로그내 프로그램.
두 개의 accept4() 시스템 호출이 있습니다(시스템 호출 번호 288):
- 14행: 첫 번째 accept4() 시스템 호출, 항목입니다.
- 18행: 첫 번째 accept4() 시스템 호출을 수행하고 종료합니다.
- 86행: 두 번째 accept4() 시스템 호출, 진입점입니다.
- 90행: 두 번째 accept4() 시스템 호출, 종료.
"strace" 프로그램에서:
의심스러운 accept4()는 (-1)을 반환하고 "strace" 플래그는 EAGAIN입니다.
그러나 'errno' 절차에 따르면 다음과 같습니다.
~$ errno 1
EPERM 1 Operation not permitted
~$ errno 11
EAGAIN 11 Resource temporarily unavailable
첨부된 로그"strace" 프로그램의
두 개의 accept4() 시스템 호출이 있습니다(시스템 호출 번호 288):
- 4행: 첫 번째 Accept4() 시스템 호출.
- 15행: 두 번째 accept4() 시스템 호출.
내 질문은 다음과 같습니다
- strace가 내 프로그램과 다른 반환 값을 보고하는 이유는 무엇입니까?
- 두 번째 accept4() 시스템 호출에서 반환된 (-11)을 어떻게 올바르게 해석해야 합니까?
추가 기술 데이터:
플래그 "-g -Wall" 및 링커 플래그 "-lm"과 함께 gcc 컴파일러를 사용하십시오.
"gcc -v"의 중요한 데이터는 다음과 같습니다.
Target: x86_64-linux-gnu
gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04)
"cpp -v"에 경로를 포함합니다.
/usr/lib/gcc/x86_64-linux-gnu/11/include
/usr/local/include
/usr/include/x86_64-linux-gnu
/usr/include
답변1
strace
모든 오류는 오류 코드와 함께 -1로 반환되는 것으로 보입니다.
$ strace ls /enoent
...
stat("/enoent", 0x55c15dfbb150) = -1 ENOENT (No such file or directory)
이것이 시스템 호출 래퍼 함수가 반환하는 것이므로 커널이 값만 반환하더라도 완전히 잘못된 것은 아닙니다. (맨 페이지의 표를 보면 syscall(2)
커널에서 반환 값과 오류가 반환되는 방식에 아키텍처마다 차이가 있습니다.)
사용자 공간 인터페이스에 따라 값을 표시하는 것은 단지 사용성 선택일 수도 있지만 잘 모르겠습니다.