2012-01-04 3 views
2

고객 요구 사항에 따라 CentOS 5.6을 기본 커널과 함께 설치했습니다. 이 커널을 설치하면 time.h 파일에 #define CLOCK_MONOTONIC이 포함됩니다.실시간 커널 헤더를 사용하여 사용자 공간 코드와 기본 헤더 비교

이제 실시간 커널이 kernel-devel과 함께 설치되었으며 코드에서 CLOCK_MONOTONIC_RAW를 사용하려고합니다. 커널 헤더 파일의 일부로 존재하지만 코드를 컴파일 할 때 표준 사용자 공간에 포함되어 있지 않습니다.

제 질문은, 실시간 커널에 기본적으로 포함 된 time.h를 포함/대체하는 적절한 절차는 무엇입니까? 내 연구에서 심볼릭 링크가 좋지 않은 것처럼 보이므로 어떻게 처리해야합니까? 절차 또는 프로세스는 무엇입니까? CentOS 6.0 또는 5.7 로의 업그레이드는 고객 요구 사항에 대한 옵션이 아닙니다. 감사.

답변

1

음, userspace 코드는 사용자 공간 헤더를 사용합니다. 커널 모듈은 커널 헤더를 사용합니다 (사용자 공간 코드와 커널 헤더를 혼합하기 때문에 심볼릭 링크가 나쁜 이유입니다).

CLOCK_MONOTONIC_RAW의 정의를 얻으려면 glibc를 업데이트해야합니다. CLOCK_ 정의의 경우 "경계선"(여전히 사용자 공간으로 간주됩니다)!/usr/include/linux의 헤더는 사용되지 않습니다.

CentOS 5 기본 설치에서는 glibc (2.5)와 커널 (2.6.18)이 모두 너무 오래 되었기 때문에 사용자가 실수했습니다. glibc-2.12 (commit glibc-2.12 ~ 111)와 kernel-2.6.28은 처음으로 MONOTONIC_RAW를 가지고있다. 즉, CentOS 6이되어야한다는 의미입니다.

코드에서 #ifndef CLOCK_MONOTONIC_RAW, #define CLOCK_MONOTONIC_RAW 4, #endif과 같은 것을 사용하여 부정 행위를 시도 할 수 있지만 이식 할 수없는 것으로 간주됩니다.

+0

응답 해 주셔서 감사합니다. 그것은 내가 어디에서나 찾을 수있는 가장 명확한 대답이므로 설명에 감사드립니다. 2.6.18 이상의 업데이트 된 커널을 사용하고 있지만 헤더 파일은 여전히 ​​"src"디렉토리에 있습니다. 실시간 커널 헤더 파일을 glibc 위치에 복사하는 절차가 있습니까? 나는 어떤 의미가 있습니까? 답변 해 주셔서 다시 한 번 감사드립니다. – cabanaboy

+0

당신은 M ....에 들어갈 수 없습니다. 리눅스의 time.h에 의해 glibc의 비트/time.h를 덮어 씌울 수 없으며, 그것은 결코 작동하지 않을 것입니다. –

0

CLOCK_MONOTONIC_RAW의 정의는 Fedora 11 설치시 /usr/local/include/linux/time.h에 있지만 기본적으로 사용할 수없는 것으로 보입니다. clock_gettime을 선언하거나 clockid_t를 정의하지는 않지만 struct timerspec 및 struct itimerspec을 기쁘게 정의합니다. 전자는 "#ifndef _STRUCT_TIMESPEC"앞에 붙어 있기 때문에 끄면되지만, 후자는 완전히 보호되지 않으므로 충돌하는 정의가 없어도 동일한 파일에 포함하거나 포함 할 수 없습니다.

/usr/include의 헤더를 사용하여 #include 지시어를 사용할 수있는 약간의 충돌이있을 수 있지만, 포기하고 그냥 내 프로젝트의 소스 코드 디렉토리에 linux 버전을 복사 한 다음 내가 필요로하지 않았던 여분의 쓰레기를 주석 처리했다. 휴대성에 많은 도움이됩니다.

관련 문제