2019. 6. 7. 02:13ㆍ임베디드/리눅스시스템프로그래밍
task id를 출력하는(pid는 같은 Thread Group ID이라면 동일한 ID 출력) gettid 함수를 사용하면 컴파일이 잘 되지 않을 것이다. 그 이유는 man page에서 찾을 수 있다
#include <sys/types.h> pid_t gettid(void);Note: There is no glibc wrapper for this system call; see NOTES.
[출처] https://linux.die.net/man/2/gettid
glibc의 wrapper 함수가 아니라는 점을 주목하라고 한다. 과연 무슨 의미인가? API 계층을 살펴보면 밑에 있는 번호는 man page 번호를 의미한다. 3번은 2번을 좀 더 쉽게 사용하고자 만든 라이브러리 함수, 예를 들어 fopen, fread 등 man page 3번을 보면 된다. 2번 함수는 시스템 콜 함수이지만, glibc의 함수로 직접적으로 커널에 접근하는 함수는 아닌 2, 3번 모두 API 형태다. 쉽게 말해 glibc가 system call을 연결만 해주는 함수를 제공하는 것이다. 함수 내에서 syscall을 호출하게 된다. 껍데기만 있는 이런 함수를 wrapper function이라고 합니다.
3번 함수 (라이브러리)
----------
2번 함수 (시스템 콜)
----------
커널
glibc가 모든 system call에 대해 wrapper function을 제공하지는 않는다. 대표적으로 gettid() system call이 그렇다. 그래서 우리 코드에서 gettid()를 호출하면 implicit declaration error가 발생한다. 이럴 때 필요한 것이 바로 syscall() API 입니다. glibc의 wrapper function 없이 system call을 바로 호출하는 것이다. 그래서 gettid의 man page를 보시면 glibc에서 구현하지 않았다는 언급이 있다
(잘못된 코드)
int main(int argc, char **argv)
{
printf("tid=%d\n", gettid());
return 0;
}
(맞는 코드)
int main(int argc, char **argv)
{
pid_t tid;
tid = syscall(SYS_gettid); // tid = syscall(__NR_gettid);
printf("tid:%d\n", tid);
return 0;
}
'임베디드 > 리눅스시스템프로그래밍' 카테고리의 다른 글
pthread와 clone 쓰레드의 메모리 반환 시기의 차이 (0) | 2019.06.11 |
---|---|
GNU C library download (0) | 2019.06.10 |
파일 소유에서의 root 사용자와 로그인 사용자 구분 (0) | 2019.06.06 |
sched_setscheduler (0) | 2019.06.05 |
fork 후 _exit를 반드시 해야하는 이유 (0) | 2019.06.04 |