2015-01-29 1 views
0

사용자 정의 시스템 호출에서 시간을 사람이 읽을 수있는 형식 (예 : Jan 29 2015 05:53:12)으로 인쇄하려고합니다. 이전에 사용했기 때문에 표준 C 프로그램에서 작동하는 코드를 사용하지만 시스템 호출 내에서 어떤 이유로 작동하지 않습니다.사람이 읽을 수있는 시간을 출력하는 커널 시스템 호출을 작성하십시오.

#include<linux/linkage.h> 
#include<linux/kernel.h> 
#include<linux/sched.h> 
#include<linux/time.h> 

asmlinkage long sys_mycall (int someVal) 
{ 
    time_t t; 
    time(&t); 

    printk("myInt: %d", someVal); 
    printk("%s", ctime(&t)) ; 

    return 0 ; 
} 

가 나는 리눅스/time.h을 포함하더라도, 암시 적 기능 '시간'의 선언과 'ctime이'에 오류를 받고 있어요 (I는 단지 time.h 시도). 그리고 % s을 (를) 지정했을 때 int 형을 반환하는 ctime에서 오류가 발생했습니다.

나는 이것이 무엇인가 잘못되었다는 것을 알고 있지만, 정확히 무엇인가? 나는 그것을 sys 호출에 포함시키는 것을 허락하지 않습니까?

감사합니다.

답변

3

커널 코딩 환경은 ctime()과 같은 다양한 표준 C 함수가 없거나 표준 함수와 동일한 방식으로 동작하지 않을 수도 있음을 의미하는 C의 "호스트 된"구현이 아닙니다. 실제로 ctime()은 커널 안에 전혀 존재하지 않습니다.

대신, struct tm의 고장난 시간에 time_t 변환 <linux/time.h>에서 time_to_tm()를 사용할 수 있으며, 개별적 struct tm의 구성 요소를 인쇄 할 수 있습니다.

커널에 대한 전체 "현재 시간대"가 없기 때문에 time_to_tm()으로 시간대 오프셋을 제공해야합니다. 시간대는 표시 설정이므로 사용자 공간에서 완전히 처리됩니다. 이것은 커널이 일반적으로 시간을 "사람이 읽을 수있는"것으로 형식화하지 않는 한 가지 이유입니다. 시간대 오프셋을 제공 할 가치가없는 경우 0을 사용하면 고장 시간이 UTC로 표시됩니다.

time() 대신 현재 시간 (초)을 커널 내부에서 얻으려면 get_seconds()을 사용하십시오.

0

커널에서 ctime() 기능을 사용할 수 없습니다.

사실, 커널에는 날짜/시간 형식 지정 기능이 거의 없습니다. 이 기능의 대부분은 사용자 공간에서만 사용할 수 있습니다. 커널에서 타임 스탬프를 생성하려면 포맷을 시도하지 마십시오. time_t을 반환하고 사용자 공간 응용 프로그램에서 서식을 처리하게하십시오.

충분하지 않고 정말로 읽을 수있는 시간 소인이 필요하면 직접 필요한 기능을 정의해야합니다.

관련 문제