시스템 콜 함수에 대한 질문입니다

미해결질문
유영재 프로필

안녕하세요.

리눅스 man page 기준으로

3번 함수 (라이브러리)

----------

2번 함수 (시스템 콜)

----------

커널

이렇게 계층?이 나눠진 것으로 알고 있습니다. 3번 함수는 2번 함수를 좀 더 사용자가 쉽게 쓰고자 제공한 것으로 알고 있습니다

그런데 공부하다보니 2번 함수 밑에도 원본?계층이 존재하는 것 같은데?

가령 syscall(__NR__, ..., ... , ...) 이렇게 부르는 경우가 있는데 이 점에 대해서 한번 짚어주실 수 있나요?

예시를 원하시면 예시 코드를 올리도록 하겠습니다

ProgCoach4U 프로필
ProgCoach4U 3달 전

우리가 사용하는 open, close 등의 API는 system call 입니다. 그런데 우리가 이 API를 호출하는 것이 system call을 직접 호출하는 것이 아닙니다. 우리는 glibc가 제공하는 open() 함수를 호출하는 것이고, 이 glib의 open 함수 내에서 실제 system call을 호출합니다. 쉽게 말해 glibc가 system call을 연결만 해주는 함수를 제공하는 것이죠. 껍데기만 있는 이런 함수를 wrapper function이라고 합니다. 

glibc가 모든 system call에 대해 wrapper function을 제공하지는 않습니다. 대표적으로 gettid() system call이 그렇습니다. 그래서 우리 코드에서 gettid()를 호출하면 implicit declaration error가 발생합니다. 이럴 때 필요한 것이 바로 syscall() API 입니다. glibc의 wrapper function 없이 system call을 바로 호출하는 것이죠. gettid의 man page를 보시면 glibc에서 구현하지 않았다는 언급이 있습니다. syscall() man page의 예제에는 gettid()를 대신할 수 있는 코드도 나오네요.

 

유영재 프로필
유영재 3달 전

와....감사합니다!!!!!