17 ë‚ ì§œì™€ 시간
ì´ ì ˆì€ í˜„ìž¬ì˜ ì‹œê°„ê³¼, 다르게 ì‹œê°„ì„ í‘œí˜„í•˜ëŠ” 방법들 사ì´ì˜ ì „í™˜ì„ ê²°ì •í•˜ëŠ” í•¨ìˆ˜ë“¤ì„ í¬í•¨í•˜ì—¬,
ë‚ ì§œì™€ ì‹œê°„ë“¤ì„ ìœ„í•œ í•¨ìˆ˜ë“¤ì„ ì„¤ëª…í•˜ê³ ìžˆë‹¤.
시간 í•¨ìˆ˜ë“¤ì€ ì„¸ 가지 주요한 범주로 나뉘어진다.
ê²½ê³¼ëœ CPU ì‹œê°„ì„ ê³„ì‚°í•˜ëŠ” í•¨ìˆ˜ë“¤ì€ 17. 1ì ˆ [Processor Time] ì—서 ë…¼ì˜ë˜ì—ˆë‹¤.
ì ˆëŒ€ 시ê°ì´ë‚˜ ë‹¬ë ¥ ì‹œê°„ì„ ê³„ì‚°í•˜ëŠ” í•¨ìˆ˜ë“¤ì€ 17. 2ì ˆ [Calendar Time] ì—서 ë…¼ì˜ë˜ì—ˆë‹¤.
알람과 타ì´ë¨¸ë¥¼ ì„¤ì •í•˜ëŠ” í•¨ìˆ˜ë“¤ì€ 17. 3ì ˆ [Setting an Alarm] ì—서 ë…¼ì˜ë˜ì—ˆë‹¤.
ë§Œì¼ ë‹¹ì‹ ì´ ë‹¹ì‹ ì˜ í”„ë¡œê·¸ëž¨ì„ ìµœì í™” 하거나, ë˜ëŠ” ê·¸ íš¨ìœ¨ì„±ì„ ê³„ì‚°í•˜ë ¤í•œë‹¤ë©´, ì–´ëŠ ì£¼ì–´ì§„
ì§€ì ì´í›„ì—, 얼마나 ë§Žì€ í”„ë¡œì„¸ì„œ 시간과 CPU ì‹œê°„ì´ í˜ë €ëŠ”ì§€ë¥¼ 알 수 있ë„ë¡ í•˜ëŠ” ìœ ìš©í•œ 방법ì´
있다. 프로세서 ì‹œê°„ì€ ë²½ì‹œê³„ì™€ëŠ” 다른ë°, ê·¸ê²ƒì€ ë²½ì‹œê³„ê°€ ìž…/ì¶œë ¥ì´ë‚˜ 다른 ì–´ë–¤ 프로세스가 ë™ìž‘하ê³
있는 ë™ì•ˆ 얼마나 ì‹œê°„ì´ í˜ë €ëŠ”ì§€ë¥¼ 알리지 않기 때문ì´ë‹¤. 프로세서 ì‹œê°„ì€ ë°ì´í„° 타입 clock_t로
표현ë˜ê³ , 단ì¼í•œ í”„ë¡œê·¸ëž¨ì˜ ì‹œìž‘ì ì—서 í‘œì‹œëœ ì–´ë–¤ 기준 시간과 ì—°ê´€ëœ ì‹œê°„ì˜ íë¦„ì„ ìˆ«ìžë¡œ
표현한다.
í”„ë¡œì„¸ìŠ¤ì— ì˜í•´ 사용ëœ, ê²½ê³¼ëœ CPU ì‹œê°„ì„ ì–»ê¸° 위해서는, ë‹¹ì‹ ì€ clock함수를 ì‚¬ìš©í• ìˆ˜ 있다. ì´
함수는 í—¤ë”íŒŒì¼ 'time. h'ì— ì„ ì–¸ë˜ì–´ 있다.
특별한 사용 예로, ë‹¹ì‹ ì´ ì‹œìž‘ì ê³¼ ëì 사ì´ì˜ ì‹œê°„ì˜ ê°„ê²©ì„ êµ¬í•˜ë ¤ë©´, clock함수를 í˜¸ì¶œí•˜ê³ , ê·¸
ê°’ë“¤ì„ ë‚˜ì¤‘ ê°’ì—서 ì²˜ìŒ ê°’ì„ ë¹¼ê³ , ê·¸ë¦¬ê³ CLOCKS_PER_SEC로 나누어ë¼( 초당 횟수(clock ticks)ì˜
숫ìžë¥¼ 얻기 위해서 ), ë‹¤ìŒ í”„ë¡œê·¸ëž¨ì²˜ëŸ¼.
- #include <time. h>
-
- clock_t start, end;
- double elapsed;
-
- start = clock();
- . . .
- /* ë¨¼ì € ì¼ì„ 시작하기 ì „ì— clock함수를 호출한 ë‹¤ìŒ ë‹¹ì‹ ì´ ê²½ê³¼ëœ ì‹œê°„ì„ ì–»ê¸° ì›í•˜ëŠ” ê·¸ ì¼ì„
ì‹œìž‘í•˜ë¼ */
- end = clock();
- elapsed = ((double) (end - start)) / CLOCKS_PER_SEC;
다른 컴퓨터와 ìš´ì˜ì²´ì œì—서 어떻게 프로세서 ì‹œê°„ì„ ê¸°ì–µí•˜ëŠ”ì§€ëŠ” 매우 광범위한 ë¬¸ì œì´ë‹¤. 100ë¶„ì˜
1초나, 100ë§Œë¶„ì˜ 1ì´ˆ 사ì´ì˜ 내부프로세스 시계를 갖는 ê²ƒì´ ë³´í†µì´ë‹¤.
GNU 시스템ì—서 clock_t는 long int 와 ë™ë“±í•˜ê³ , CLOCKS_PER_SEC는 ì •ìˆ˜ê°’ì´ë‹¤. 그러나 다른
시스템ì—서는, clock_t는 ì •ìˆ˜ì´ê³ , 매í¬ë¡œ CLOCKS_PER_SEC는 플로팅-í¬ì¸íЏ 형으로 서로 다르다.
ì–´ë–¤ 시스템 í•˜ì— ë†“ì—¬ìžˆë“ ì§€ ìƒê´€ì—†ì´ ì 당하게 ìž‘ì—…ì„ ìˆ˜í–‰í•˜ê³ , ì‚°ìˆ ì 으로 ê·¸ ëª…ë ¹ì„ í™•ì¸í•˜ê¸°
위해서는 ì•„ëž˜ì˜ ì˜ˆì²˜ëŸ¼ double형으로 프로세스 íƒ€ìž„ì„ castì—°ì‚°ì„ í†µí•´ì„œ í˜•ë³€í™˜ì„ í•˜ë¼.
매í¬ë¡œ : int CLOCKS__PER__SEC
- ì´ ë§¤í¬ë¡œëŠ” clock í•¨ìˆ˜ì— ì˜í•´ ê³„ì‚°ëœ ì´ˆë‹¹ 시간주기(clock ticks)ì˜ ìˆ˜ë¥¼ 나타내는 ê°’ì´ë‹¤.
매í¬ë¡œ : int CLK__TCK
- ì´ê²ƒì€ ì˜›ë‚ ì— CLOCKS_PER_SEC ëŒ€ì‹ ì— ì“°ì´ë˜ 것ì´ë‹¤.
ë°ì´í„°íƒ€ìž… : clock__t
- ì´ê²ƒì€ clockí•¨ìˆ˜ì— ì˜í•´ ë°˜í™˜ëœ ê°’ì˜ í˜•ìœ¼ë¡œ ì‹œê°„ì£¼ê¸°ì˜ ë‹¨ìœ„ì´ë‹¤.
함수 : clock_t clock(void)
- ì´ í•¨ìˆ˜ëŠ” ê²½ê³¼ëœ í”„ë¡œì„¸ì„œ ì‹œê°„ì„ ë°˜í™˜í•œë‹¤. 기준 ì‹œê°„ì€ í•ìƒ ë‹¤ë¥´ì§€ë§Œ, ë‹¨ì¼ í”„ë¡œì„¸ìŠ¤ 안ì—서는
변경ë˜ì§€ 않는다. ë§Œì¼ ê·¸ 프로세서 ì‹œê°„ì´ ìœ ìš©í•˜ì§€ 않거나 표현ë 수 없다면, clockì€
(clock_t)(-1)ì˜ ê°’ì„ ë°˜í™˜í•œë‹¤.
times 함수는 ê²½ê³¼ëœ í”„ë¡œì„¸ì„œ ì‹œê°„ì— ëŒ€í•´ì„œ struct tms오브ì 트로 ë” ìƒì„¸í•œ ì •ë³´ë¥¼ 반환한다. ì´
함수는 í—¤ë”íŒŒì¼ `sys'times. h'ì— ì„ ì–¸ë˜ì–´ 있다.
ë°ì´í„° 타입 : struct tms
- tms구조체는 프로세스 ì‹œê°„ë“¤ì— ëŒ€í•œ ì •ë³´ë¥¼ ë°˜í™˜í•˜ëŠ”ë° ì‚¬ìš©ëœë‹¤. ê·¸ê²ƒì€ ì ì–´ë„ ë‹¤ìŒê³¼ ê°™ì€
ë©¤ë²„ë“¤ì„ í¬í•¨í•˜ê³ 있다.
clock_t tms_utime
- ì´ê²ƒì€ í˜¸ì¶œëœ í”„ë¡œì„¸ìŠ¤ì˜ ëª…ë ¹ë“¤ì„ ìˆ˜í–‰í•˜ëŠ”ë° ì‚¬ìš©ëœ CPU 시간ì´ë‹¤.
clock_t tms_stime
- ì´ê²ƒì€ í˜¸ì¶œëœ í”„ë¡œì„¸ìŠ¤ ë•Œë¬¸ì— ì‹œìŠ¤í…œì—서 ì‚¬ìš©ëœ CPU 시간ì´ë‹¤.
clock_t tms_cutime
- ì´ê²ƒì€ wait ë˜ëŠ”, waitpidì— ì˜í•´ 부모 프로세스ì—게 ë³´ê³ ëœ ìƒí™©ìœ¼ë¡œ, í˜¸ì¶œëœ í”„ë¡œì„¸ìŠ¤ì˜
ëª¨ë“ ì¢…ë£Œëœ ìžì‹ í”„ë¡œì„¸ìŠ¤ë“¤ì˜ tms_utime ê³¼ tms_cutimeì˜ ê°’ë“¤ì„ í•©í•œ ê°’ì´ë‹¤; 23. 6ì ˆ
[Process Completion] 참조. 즉, 호출한 í”„ë¡œì„¸ìŠ¤ì˜ ëª¨ë“ ì¢…ë£Œëœ ìžì‹ 프로세스 ì˜ ëª…ë ¹ì„
ìˆ˜í–‰í•˜ëŠ”ë° ì‚¬ìš©ëœ ì´ CPU ì‹œê°„ì„ ë‚˜íƒ€ë‚¸ë‹¤.
clock_t tms_cstime
- ì´ê²ƒì€ tms_cutimeê³¼ ìœ ì‚¬í•˜ì§€ë§Œ, í˜¸ì¶œëœ í”„ë¡œì„¸ìŠ¤ì˜ ëª¨ë“ ì¢…ë£Œëœ ìžì‹ í”„ë¡œì„¸ìŠ¤ë“¤ì„ ìœ„í•˜ì—¬
시스템ì—서 ì‚¬ìš©ëœ ì´ CPU ì‹œê°„ì„ ë‚˜íƒ€ë‚¸ë‹¤.
ëª¨ë“ ì‹œê°„ë“¤ì€ ì‹œê°„ì£¼ê¸°(clock ticks)로 주어진다. ì´ë“¤ì€ ì ˆëŒ€ê°’ì´ë‹¤; ìƒˆë¡œì´ ë§Œë“¤ì–´ì§„ 프로세스ì—서,
ê·¸ë“¤ì€ ëª¨ë‘ 0ì´ë‹¤. 23. 4 [Creatina a Precess] 참조.
함수 : clock_t times (struct tms *buffer)
- times 함수는 í˜¸ì¶œëœ í”„ë¡œì„¸ìŠ¤ë¥¼ 위한 프로세서 시간 ì •ë³´ë¥¼ bufferì— ì €ìž¥í•œë‹¤. ë°˜í™˜ê°’ì€ clock()ì˜
ê°’ê³¼ ë™ì¼í•˜ë‹¤: ì–´ë–¤ 기준 시간ì—서 ì‹¤ì œë¡œ ê²½ê³¼ëœ ì‹œê°„. 기준 ì‹œê°„ì€ ì–´ë–¤ 특별한 프로세스
ìƒì—서는 변하지 않는 ìƒìˆ˜ ê°’ì´ê³ , 시스템 시작시간과 ì—°ê´€ëœ ì‹œê°„ìœ¼ë¡œ 표현한다. 실패를 하면
(clock_t)(-1)ì˜ ê°’ì„ ë°˜í™˜í•˜ë‹¤.
ì´ì‹ì„± 노트: 17. 1. 1ì ˆ [Basic CPU Time] 233ì—서 ì„¤ëª…ëœ clock 함수는, ANSI C 표준함수ì´ê³ ,
times 함수는 POSIX. 1ì˜ í•¨ìˆ˜ì´ë‹¤. GNU 시스템ì—서는, clock함수로 í‘œí˜„ëœ ê°’ì€ timesì— ì˜í•´
ë°˜í™˜ëœ tms_utime ê³¼ tms_stimeì˜ í•©ê³„ì™€ ë™ë“±í•œ ê°’ì´ë‹¤.
ì´ ì ˆì€ ê·¸ë ˆê³ ë¦¬ë ¥ì— ì˜í•œ ë‚ ì§œì™€ ì‹œê°„ë“¤ì„ ê¸°ì–µí•˜ê¸° 위한 ë„êµ¬ë“¤ì„ ì„¤ëª…í•˜ê³ ìžˆë‹¤.
ë‚ ì§œì™€ 시간 ì •ë³´ë¥¼ 위한 세 가지 표현방법ì´ë‹¤.
ë‹¬ë ¥ 시간( ë°ì´í„° 타입 time_t)ì€ ê°„ë‹¨ížˆ ì–´ë–¤ ì •í•´ì§„ 기준시간 ì´í›„ 몇초가 í˜ë €ëŠ”ì§€ë¥¼ 숫ìžë¡œ
표현한다.
ë˜í•œ 초를 미세하게 나누어서 표현하는 ê³ í•´ìƒë„ 시간 í‘œí˜„ì´ ìžˆë‹¤ (ë°ì´í„° 타입 struct timeval). ë‹¹ì‹ ì´
í° ì •ë°€ë„를 필요로 í• ë•Œ ë³´í†µì˜ ë‹¬ë ¥ ì‹œê°„ëŒ€ì‹ ì´ ì‹œê°„ í‘œí˜„ì„ ì‚¬ìš©í•˜ë¼.
ì§€ì— ì‹œê°„ì´ë‚˜ broken-down time( ë°ì´í„°íƒ€ìž… struct tm)ì€ ì •í•´ì§„ 시간 구ì—ì—서 ì •í•´ì§„ ë…„, 달, 등등ì˜
êµ¬ì„±ìš”ì†Œë“¤ì˜ ì§‘í•©ìœ¼ë¡œ ë‚ ì§œì™€ ì‹œê°„ì„ í‘œí˜„í•œë‹¤. ì´ ì‹œê°„ í‘œí˜„ì€ ë³´í†µ 형ì‹í™”ëœ ë‚ ì§œì™€ 시간 값들ì„
ê²°í•©í•˜ëŠ”ë° ì‚¬ìš©ëœë‹¤.
ì´ ì ˆì€ ë‹¬ë ¥ ì‹œê°„ì„ í‘œí˜„í•˜ê¸° 위한 ë°ì´í„° 타입 time_t와 ë‹¬ë ¥ 시간 오브ì 트ì—서 ë™ìž‘하는 함수들ì„
설명한다. ì´ ë„êµ¬ë“¤ì€ í—¤ë”íŒŒì¼ `time. h'ì— ì„ ì–¸ë˜ì–´ 있다.
ë°ì´í„° 타입 : time_t
- ì´ê²ƒì€ ë‹¬ë ¥ ì‹œê°„ì„ í‘œí˜„í•˜ê¸° 위해서 사용하는 ë°ì´í„° 타입ì´ë‹¤. GNU C ë¼ì´ë¸ŒëŸ¬ë¦¬ì™€ 다른
POSIX-계열ì—서, time_t는 long int 와 같다. ì ˆëŒ€ì‹œê°„ 값으로 í•´ì„ë 때, ê·¸ê²ƒì€ í˜‘ì • 세계시간
1970ë…„ 1ì›” 1ì¼ 00: 00: 00 시간 ì´í›„ ê²½ê³¼ëœ ì´ˆì˜ ìˆ˜ë¥¼ 표현한다. ( ì´ ë‚ ì§œëŠ” 때때로
시대(epoch)ë¡œì¨ ì‚¬ìš©ëœë‹¤. ) 다른 시스템ì—서, time_t는 ì •ìˆ˜ì´ê±°ë‚˜ 플로팅-í¬ì¸íЏì´ê±°ë‚˜ í•
것ì´ë‹¤.
함수 : double difftime (time_t time1, time_t time0)
- difftime 함수는 double 형으로 time1ê³¼ time2 사ì´ì˜ ê²½ê³¼ëœ ì‹œê°„ì„ ì´ˆë¡œ 반환한다. GNU
시스템ì—서, ë‹¹ì‹ ì€ ê°„ë‹¨ížˆ time_t ê°’ë“¤ì„ ë¹¼ëŠ” 것으로 ê·¸ ê°’ì„ êµ¬í• ìˆ˜ 있지만, 다른 시스템ì—서는
time_t ë°ì´í„° íƒ€ìž…ì€ ì§ì ‘ì 으로 빼기를 í• ìˆ˜ê°€ 없게, 기호화 ë˜ì–´ìžˆì„ 것ì´ë‹¤.
함수 : time_t time (time_t *result)
- time 함수는 time_tì˜ í˜•ìœ¼ë¡œ í‘œí˜„ëœ ê°’ìœ¼ë¡œ í˜„ìž¬ì˜ ì‹œê°„ì„ ë°˜í™˜í•œë‹¤. ë§Œì¼ ì¸ìˆ˜ resultê°€ ë„
í¬ì¸í„°ê°€ 아니ë¼ë©´, timeê°’ì€ *resultì— ì €ìž¥ë˜ì–´ì§„다. ë§Œì¼ ë‹¬ë ¥ ì‹œê°„ì´ ìœ ìš©í•˜ì§€ 않다면,
(time_t)(-1)ì´ ë°˜í™˜ëœë‹¤.
time_t ë°ì´í„° íƒ€ìž…ì€ ì˜¤ì§ 1ì´ˆ 사ì´ì˜ í•´ìƒë„를 갖는 ë‹¬ë ¥ ì‹œê°„ë“¤ì„ í‘œí˜„í•˜ê¸° 위해 사용한다. ì–´ë–¤
ì‘ìš©í”„ë¡œê·¸ëž¨ì€ ë” ì •ë°€í• í•„ìš”ê°€ 있다.
그래서, GNU C ë¼ì´ë¸ŒëŸ¬ë¦¬ì—서는 1ì´ˆ 보다 ë” ë†’ì€ ê³ í•´ìƒë„ì˜ ë‹¬ë ¥ì‹œê°„ì„ í‘œí˜„í• ìš©ëŸ‰ì´ ìžˆëŠ”
í•¨ìˆ˜ë“¤ì„ ê°–ê³ ìžˆë‹¤. ì´ ì ˆì—서 ì„¤ëª…í•˜ê³ ìžˆëŠ” 함수들과 ì—°ê´€ëœ ë°ì´í„° íƒ€ìž…ë“¤ì€ `sys/time. h'ì—
ì„ ì–¸ë˜ì–´ 있다.
ë°ì´í„° 타입 : struct timeval
- 구조체 struct timevalì€ ë‹¬ë ¥ ì‹œê°„ì„ í‘œí˜„í•œë‹¤. ê·¸ê²ƒì€ ë‹¤ìŒê³¼ ê°™ì€ ë©¤ë²„ë“¤ì„ ê°–ê³ ìžˆë‹¤.
long int tv_sec
- ì´ê²ƒì€ epoch ì´í›„를 ì´ˆ(second)로 표현한다. ì´ê²ƒì€ 보통 time_t ê°’ê³¼ ë™ì¼í•˜ë‹¤.
long int tv_usec
- ì´ê²ƒì€ 마ì´í¬ë¡œì´ˆ(microsecond)로 í‘œí˜„ëœ ì‹œê°„ê°’ì´ë‹¤. ì–´ë–¤ 시간 struct timeval ê°’ë“¤ì€ ì‹œê°„
ê°„ê²©ë“¤ì„ ìœ„í•œ 사용ìžì´ê³ , 그러면 tv_sec 멤버는 간격ì—서 ê²½ê³¼ëœ ì´ˆ(second) ì´ê³ , tv_usec는
부가ì 으로 í른 시간 마ì´í¬ë¡œ ì´ˆì˜ ìˆ˜ì´ë‹¤.
ë°ì´í„° 타입 : struct timezone
- 구조체 struct timezone는 ì§€ì— ì‹œê°„ëŒ€ì— ëŒ€í•œ ìµœì†Œì˜ ì •ë³´ë¥¼ ì €ìž¥í•˜ê¸° 위해 사용ëœë‹¤. 그것ì€
다ìŒì˜ ë©¤ë²„ë“¤ì„ ê°–ëŠ”ë‹¤.
int tz_minuteswest
- ì´ê²ƒì€ 그리니치 표준시(GMT)ì˜ minutes westì˜ ìˆ˜ì´ë‹¤.
int tz_dsttime
- ë§Œì¼ 0ì´ ì•„ë‹ˆë¼ë©´, ê·¸ í•´(year)ì˜ ì–´ë–¤ 기간ë™ì•ˆ ì¼ê´‘ ì ˆì•½ì‹œê°„ì„ ì 용한다.
struct timezone í˜•ì€ ì ˆëŒ€ê°’ì´ê³ ê²°ì½” ì‚¬ìš©í• ì¼ì€ ì—†ì„ ê²ƒì´ë‹¤. ëŒ€ì‹ ì— 17. 2. 6ì ˆ [Time Zone
Functions] ì—서 ì„¤ëª…ëœ ë„구들ì—서 사용한다.
struct timevalí˜•ì˜ ë‘ ê°’ë“¤ì„ ë¹¼ëŠ” ê²ƒì´ ì¢…ì¢… 필요하다. ì´ê³³ì—는 ì´ëŸ° ì¼ì„ 하는 가장 ì¢‹ì€ ë°©ë²•ì´
있다. ê·¸ê²ƒì€ tv_sec 멤버가 unsigned í˜•ì¸ ì–´ë–¤ 기묘한 ìš´ì˜ì²´ì œí•˜ì—서 ì¡°ì°¨ë„ ëŒì•„간다.
/* `struct timeval'ì˜ í˜•ì„ ê°€ì§„ ê°’ X 와 Y를 ë¹¼ê³ , ê·¸ 결과는 RESULTì— ì €ìž¥í•˜ë¼. ê·¸ ì°¨ì´ê°€
ìŒìˆ˜ì´ë©´ 1ì„ ë°˜í™˜í•˜ê³ , ê·¸ë ‡ì§€ 않으면 0ì„ ë°˜í™˜í•˜ë¼ */
- int
- timeval_subtract (result, x, y)
- struct timeval *result, *x, *y;
- {
- /* ê°±ì‹ ëœ y로 ë‚˜ì¤‘ì— ë¹¼ê¸°ë¥¼ 하기 위해, yê°’ì„ ê°€ì ¸ì™€ë¼ */
- if (x->tv_usec < y->tv_usec) {
- int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
- y->tv_usec -= 1000000 * nsec;
- y->tv_sec += nsec;
- }
- if (x->tv_usec - y->tv_usec > 1000000) {
- int nsec = (y->tv_usec - x->tv_usec) / 1000000;
- y->tv_usec += 1000000 * nsec;
- y->tv_sec -= nsec;
- }
-
- /* ê¸°ë‹¤ë¦¼ì„ ìœ„í•œ ì‹œê°„ì„ ê³„ì‚°í•˜ë¼. tv_usec는 ì–´ë–¤ ì–‘ì˜ ê°’ì´ë‹¤. */
- result->tv_sec = x->tv_sec - y->tv_sec;
- result->tv_usec = x->tv_usec - y->tv_usec;
-
- /* ë§Œì¼ ê²°ê³¼ê°€ ìŒìˆ˜ì´ë©´ 0ì„ ë°˜í™˜í•˜ë¼ */
- return x->tv_sec < y->tv_sec;
- }
함수 : int gettimeofday (struct timeval *tp, struct timezone *tzp)
- gettimeofday 함수는 tp ê°€ ê°€ë¦¬í‚¤ê³ ìžˆëŠ” 구조체 struct timevalì—서 í˜„ìž¬ì˜ ë‚ ì§œì™€ 시간ì„
반환한다. ê·¸ ì‹œê°„ëŒ€ì— ëŒ€í•œ ì •ë³´ëŠ” tzpê°€ ê°€ë¦¬í‚¤ê³ ìžˆëŠ” 구조체 ì•ˆì— ë°˜í™˜ëœë‹¤. ë§Œì¼ tzp ì¸ìˆ˜ê°€ ë„
í¬ì¸í„°ë¼ë©´, 시간 대 ì •ë³´ëŠ” 무시ëœë‹¤. ë°˜í™˜ê°’ì´ 0ì´ë©´ 성공ì´ê³ , 실패면 -1ì´ë‹¤. 다ìŒì˜ errno는 ì´
함수를 위해 ì •ì˜ëœ ì—러ìƒí™©ì´ë‹¤.
ENOSYS
- ìš´ì˜ì²´ì œê°€ 시간대 ì •ë³´ 얻는 ê²ƒì„ ì§€ì›í•˜ì§€ ì•Šê³ , tzpê°€ ë„ í¬ì¸í„°ê°€ 아니다. GNU
ìš´ì˜ì²´ì œëŠ” 시간대 ì •ë³´ë¥¼ 표현하기 위해서 struct timezone를 사용하는 ê²ƒì„ ì§€ì›í•˜ì§€
않는다; ê·¸ê²ƒì€ ì˜ˆì „ì— 4. 3 BSDì—서 사용ë˜ë˜ 것ì´ë‹¤. ëŒ€ì‹ ì— 17. 2. 6ì ˆ[Time Zone
Functions] ì—서 ì„¤ëª…ëœ ë„êµ¬ë“¤ì„ ì‚¬ìš©í•˜ë¼.
함수 : int settimeofday(const sruct timeval *tp, const struct timezone *tzp)
- settimeofday 함수는 ì¸ìˆ˜ë“¤ì— ë”°ë¼ì„œ í˜„ìž¬ì˜ ë‚ ì§œì™€ ì‹œê°„ì„ ì„¤ì •í•œë‹¤. gettimeofday를 통해서,
ë§Œì¼ tzpê°€ ë„ í¬ì¸í„°ë¼ë©´, 시간대 ì •ë³´ëŠ” 무시ëœë‹¤. ë‹¹ì‹ ì´ settimeofday를 ì‚¬ìš©í• ë ¤ë©´ 특권ì´
ë¶€ì—¬ëœ ì‚¬ìš©ìžì´ì–´ì•¼ë§Œ 한다. 성공하면 ë°˜í™˜ê°’ì€ 0ì´ê³ , 실패하면 -1ì´ë‹¤.
-
- 다ìŒì˜ errno는 ì´ í•¨ìˆ˜ë¥¼ 위해 ì •ì˜ëœ ì—러ìƒí™©ì´ë‹¤.
EPERM ì´ í”„ë¡œì„¸ìŠ¤ê°€ íŠ¹ê¶Œì´ ì—†ê¸° ë•Œë¬¸ì— ì‹œê°„ì„ ì„¤ì •í• ìˆ˜ 없다.
ENOSYS ìš´ì˜ì²´ì œê°€ 시간대 ì •ë³´ë¥¼ ì„¤ì •í•˜ëŠ” ê²ƒì„ ì§€ì›í•˜ì§€ ì•Šê³ tzpê°€ ë„ í¬ì¸í„°ê°€ 아니다.
함수 : int adjtime (const struct timeval *delta, struct timeval *olddelta)
- í˜„ìž¬ì˜ ì‹œê°„ì„ ì ì°¨ì 으로 ì¡°ì •í•˜ê¸° 위해서 시스템 시계를 ë¹ ë¥´ê²Œ, ë˜ëŠ” ëŠë¦¬ê²Œ 하는 함수ì´ë‹¤.
ë§Œì¼ ê°„ë‹¨ížˆ í˜„ìž¬ì˜ ì‹œê°„ì„ ì„¤ì •í• ìˆ˜ 없는, í•ìƒ ì²œíŽ¸ì¼ë¥ ì 으로 ì¦ê°€í•˜ê¸°ë§Œ 하는 시스템
시계ë¼ë©´, ì´ê²ƒì€ ê·¸ ì‹œê°„ì„ ë§žì¶œ 수가 있다.
-
- delta ì¸ìˆ˜ëŠ” í˜„ìž¬ì˜ ì‹œê°„ì„ ìœ„í•œ ì¡°ì •ì„ ì§€ì •í•œë‹¤. ë§Œì¼ ìŒìˆ˜ë¼ë©´ 시스템 시계는 잃어버린 ë§Žì€
ì‹œê°„ì„ ë³µêµ¬í• ë•Œê¹Œì§€ 천천히 ë‚´ë ¤ê°€ê³ , ë§Œì¼ ì–‘ìˆ˜ë¼ë©´, 시스템 시계는 천천히 올ë¼ê°„다. ë§Œì¼
olddelta ì¸ìˆ˜ê°€ ë„ í¬ì¸í„°ê°€ 아니ë¼ë©´, adjtime함수는 ì¡°ì •ì´ ì•„ì§ ìˆ˜í–‰ë˜ê¸° ì „ì˜ ì•žì˜ ì‹œê°„ì— ëŒ€í•œ
ì •ë³´ë¥¼ 반환한다. ì´ í•¨ìˆ˜ëŠ” 특별히 로컬 네트ì›ìƒì˜ ì»´í“¨í„°ë“¤ì˜ ì‹œê°„ì„ ë™ê¸°í™” í•˜ëŠ”ë° ì‚¬ìš©ëœë‹¤.
-
- ë‹¹ì‹ ì€ ê·¸ê²ƒì„ ì‚¬ìš©í•˜ê¸° 위해서는 íŠ¹ê¶Œì´ ë¶€ì—¬ëœ ì‚¬ìš©ì§€ê°€ ë˜ì–´ì•¼ë§Œ 한다. 성공하면 0ì„ ë°˜í™˜í•˜ê³ ,
실패하면 -1ì„ ë°˜í™˜í•œë‹¤.
- 다ìŒì˜ errno는 ì´ í•¨ìˆ˜ë¥¼ 위해 ì •ì˜ëœ ì—러ìƒí™©ì´ë‹¤.
EPERM ë‹¹ì‹ ì€ ì‹œê°„ì„ ì„¤ì •í• ìˆ˜ 있는 íŠ¹ê¶Œì„ ê°–ê³ ìžˆì§€ 않다.
ì´ì‹ì„± 노트 : gettimeofday, settimeofday, ê·¸ë¦¬ê³ adjtime í•¨ìˆ˜ë“¤ì€ BSD로부터 왔다.
ë‹¬ë ¥ ì‹œê°„ì€ ì´ˆë‹¨ìœ„ë¡œ 표현ëœë‹¤. ì´ê²ƒì€ 계산하기는 편리하지만, ì‚¬ëžŒì´ ë³´í†µ ë‚ ì§œì™€ ì‹œê°„ì„ í‘œí˜„í•˜ëŠ”
방법과는 다르다. 그와 달리, broken-down ì‹œê°„ì€ ì—°ë„, 달, ë‚ ì§œ ë“±ì„ ë¶„ë¦¬í•˜ì—¬ 2진으로 표현한다.
Broken down ì‹œê°„ê°’ì€ ê³„ì‚°ì—는 불편하지만, ê·¸ë“¤ì€ ì¸ê°„ì´ ì½ì„ 수 있는 시간으로 ìœ ìš©í•˜ê²Œ 사용ëœë‹¤.
broken-down ì‹œê°„ê°’ì€ ì§€ì—ì‹œê°„ëŒ€ì˜ ì„ íƒê³¼ í•ìƒ ì—°ê´€ë˜ì–´ ìžˆê³ , ê·¸ê²ƒì€ í•ìƒ ì–´ë–¤ 시간대가
사용ë˜ì—ˆìŒì„ ì§€ì 한다. ì´ ì ˆì— ìžˆëŠ” ì‹¬ë³¼ë“¤ì€ í—¤ë”íŒŒì¼ `time. h'ì— ì„ ì–¸ë˜ì–´ 있다.
ë°ì´í„° 타입 : struct tm
- ì´ê²ƒì€ broken-down ì‹œê°„ì„ í‘œí˜„í•˜ê¸° 위해 사용ë˜ëŠ” ë°ì´í„° 타입ì´ë‹¤. ê·¸ 구조체는 ì–´ëŠ ìˆœì„œë¡œ
ë‚˜íƒ€ë‚ ìˆ˜ 있는, ì ì–´ë„ ë‹¤ìŒê³¼ ê°™ì€ ë©¤ë²„ë“¤ì„ í¬í•¨í•˜ê³ 있다.
int tm_sec
- ì´ê²ƒì€ 0ì—서 59ê¹Œì§€ì˜ ë²”ìœ„ë¥¼ 갖는 ì´ˆ(second)를 í‘œí˜„í•˜ê³ ìžˆë‹¤. (ì‹¤ì œë¡œëŠ” "윤초"를
허용해서, 61까지가 ì œí•œì´ë‹¤. )
int tm_min
- ì´ê²ƒì€ 0ì—서 59ê¹Œì§€ì˜ ë²”ìœ„ë¥¼ 갖는 ë¶„(minute)ì„ ë‚˜íƒ€ë‚¸ë‹¤.
int tm_hour
- ì´ê²ƒì€ 0ì—서 23ê¹Œì§€ì˜ ë²”ìœ„ë¥¼ 갖는 시(hours)를 나타낸다.
int tm_mday
- ì´ê²ƒì€ 1ì—서 31ê¹Œì§€ì˜ ë²”ìœ„ë¥¼ 갖는 달 ì¤‘ì˜ ê·¸ë‚ ì„ ë‚˜íƒ€ë‚¸ë‹¤.
int tm_mon
- ì´ê²ƒì€ 0ì—서 11ê¹Œì§€ì˜ ë²”ìœ„ë¥¼ 갖는, 1ì›” ì´í›„ì˜ ë‹¬ì˜ ìˆ˜ë¥¼ 표현한다.
int tm_year
- ì´ê²ƒì€ 1900ë…„ ì´í›„ì˜ ë…„(year)ì˜ ìˆ˜ì´ë‹¤.
int tm_wday
- ì´ê²ƒì€ 0ì—서 6ì˜ ë²”ìœ„ë¥¼ 갖는, ì¼ìš”ì¼ì„ 기ì 으로 해서 ì§€ë‚œë‚ ì˜ ìˆ˜ë¥¼ 나타낸다.
int tm_yday
- ì´ê²ƒì€ 0ì—서 365ì˜ ë²”ìœ„ë¥¼ 갖는, 1ì›” 1ì¼ ì´í›„ ì§€ë‚œë‚ ì˜ ìˆ˜ë¥¼ 나타낸다.
int tm_isdst
- ì´ê²ƒì€ ì‹œê°„ì„ í‘œí˜„í•˜ëŠ”ë°, ì¼ê´‘ì ˆì•½ ì‹œê°„ì´ ì˜í–¥ì„ 주는지(있었거나, ë˜ëŠ” 있ì„
ì˜ˆì •ì´ê±°ë‚˜)를 ì§€ì 하는 플래그ì´ë‹¤. ê·¸ ê°’ì€ ë§Œì¼ ì¼ê´‘ ì ˆì•½ì‹œê°„ì´ ì˜í–¥ì„ 미치면 양수ì´ê³ ,
ë§Œì¼ ê·¸ë ‡ì§€ 않으면 0ì´ê³ , ê·¸ ì •ë³´ê°€ ìŒìˆ˜ì´ë©´ ìœ ìš©í•˜ì§€ 않다.
long int tm_gmtoff
- ì´ í•„ë“œëŠ” broken-down ì‹œê°„ê°’ì„ ê³„ì‚°í•˜ëŠ”ë° ì‚¬ìš©ë˜ì–´ì§€ëŠ” 시간대를 나타낸다; ê·¸ê²ƒì€ ì´ˆì˜
단위로 그리니치 표준시(GMT)를 얻어서, ê·¸ê²ƒì— ì§€ì—ì‹œê°„ì„ ì–»ê¸° 위해서 ë”í•´ì ¸ì•¼ë§Œ 하는 ì–‘(
amount)ì´ë‹¤. ê·¸ ê°’ì€ ë³€í™” 가능한 시간대( 17. 2. 6ì ˆ [Time Zone Functions] 참조. )와 ê°™ì€
것ì´ë‹¤. ë‹¹ì‹ ì€ ë˜í•œ 그리니치 í‘œì¤€ì‹œì˜ "seconds westì˜ ìˆ˜"ë¼ê³ ìƒê°í• ìˆ˜ë„ ìžˆë‹¤.
tm_gmtoff 필드는 GNU ë¼ì´ë¸ŒëŸ¬ë¦¬ 확장ì´ë‹¤.
const char *tm_zone
- ì´ê²ƒì€ broken-down ì‹œê°„ê°’ì„ ê³„ì‚°í•˜ëŠ”ë° ì‚¬ìš©ë˜ì–´ì§€ëŠ” 시간대를 위한 세-ë¬¸ìž ì´ë¦„ì´ë‹¤.
ì´ê²ƒì€ GNU ë¼ì´ë¸ŒëŸ¬ë¦¬ 확장ì´ë‹¤.
함수 : struct tm *localtime (const time_t *time)
- localtime 함수는 timeì´ ê°€ë¦¬í‚¤ê³ ìžˆëŠ” ë‹¬ë ¥ì‹œê°„ì„ ì‚¬ìš©ìžê°€ ì •í•œ 시간대와 맞추어서,
broken-down 시간으로 변환한다. ë°˜í™˜ê°’ì€ ì–´ëŠ ë‚ ì§œì™€ 시간 í•¨ìˆ˜ë“¤ì„ í˜¸ì¶œí•´ì„œ ì–»ì€ ì •ì
broken-down 시간 구조체를 ê°€ë¦¬í‚¤ê³ ìžˆëŠ” í¬ì¸í„°ì´ë‹¤. (그러나 ì–´ëŠ ë‹¤ë¥¸ ë¼ì´ë¸ŒëŸ¬ë¦¬ í•¨ìˆ˜ë„ ì´
오브ì íŠ¸ì˜ ë‚´ìš©ì— ë§ì”Œìš°ê¸° (overwrite)를 í• ìˆ˜ 없다. ) localtimeì„ í˜¸ì¶œí•˜ëŠ” ê²ƒì€ ë‹¤ë¥¸ 하나ì˜
ì˜í–¥ì´ 있다: ê·¸ê²ƒì€ ë³€ìˆ˜ tzname를 현재 ì‹œê°„ëŒ€ì— ëŒ€í•œ ì •ë³´ë¡œ ì„¤ì •í•œë‹¤. 17. 2. 6ì ˆ [Time Zone
Functions] 참조.
함수 : struct tm *gmtime(const time_t *time)
- ì´ í•¨ìˆ˜ëŠ” broen-downì´ ì„¸ê³„ í˜‘ì •ì‹œê°„ìœ¼ë¡œ 표현ëœë‹¤ëŠ” ê²ƒì„ ì œì™¸í•˜ê³ , localtimeê³¼ ìœ ì‚¬í•˜ë‹¤.
_그리니치 표준시가 ì§€ì— ì‹œê°„ëŒ€ì™€ ë” ì—°ê´€ì´ ìžˆë‹¤. ë‹¬ë ¥ ì‹œê°„ë“¤ì€ í•ìƒ ì„¸ê³„ í˜‘ì •ì‹œë¡œ 표현ëœë‹¤ëŠ”
ê²ƒì„ ê¸°ì–µí•˜ë¼.
함수 : time_t mktime(struct tm *brokentime)
- mktime 함수는 broken-down 시간 구조체를 ë‹¬ë ¥ì‹œê°„ 표현으로 변환시키기 위해서 사용ëœë‹¤.
ê·¸ê²ƒì€ ë‹¤ë¥¸ ë‚ ì§œì— ê¸°ì´ˆí•˜ì—¬ ì—°ë„(year), 주(week)ì˜ ë‚ ìˆ˜ì™€ 시간 ìš”ì†Œë“¤ì„ ì±„ì›Œì„œ broken-down
êµ¬ì¡°ì²´ì˜ ë‚´ìš©ì„ "ì¼ë°˜í™”"한다.
-
- mktime함수는 broken-down 시간 êµ¬ì¡°ì²´ì˜ ë©¤ë²„ì¸ tm_wday와 tm_ydayì˜ ì •í•´ì§„ 내용들ì„
무시한다. ê·¸ê²ƒì€ ë‹¬ë ¥ ì‹œê°„ì„ ê³„ì‚°í•˜ê¸° 위해서 다른 êµ¬ì„±ìš”ì†Œì˜ ê°’ë“¤ì„ ì‚¬ìš©í•œë‹¤; ê·¸ê²ƒì€ ê·¸ë“¤ì˜
보통 ë²”ìœ„ì˜ ë°–ì— ìžˆëŠ” 비ì¼ë°˜í™”ëœ ê°’ë“¤ì„ ê°–ëŠ” 그들 êµ¬ì„±ìš”ì†Œë“¤ì„ ìœ„í•´ì„œ 허용ë˜ì—ˆë‹¤. mktimeì´
마지막으로 하는 ì¼ì€ brokentime êµ¬ì¡°ì²´ì˜ êµ¬ì„±ìš”ì†Œë“¤ì„ ì¡°ì •í•˜ëŠ” 것ì´ë‹¤( tm-wday 와
tm-yday를 í¬í•¨í•´ì„œ ). ë§Œì¼ ì •í•´ì§„ broken-down ì‹œê°„ì´ ë‹¬ë ¥ 시간으로 표현ë 수 없다면,
mktimeì€ (time_t)(-1)ì˜ ê°’ì„ ë°˜í™˜í•˜ê³ brokentimeì˜ ë‚´ìš©ì„ ê°±ì‹ í• ìˆ˜ 없다. í˜¸ì¶œëœ mktimeì€
ë˜í•œ í˜„ìž¬ì˜ ì‹œê°„ëŒ€ì— ëŒ€í•œ ì •ë³´ë¡œ 변수 tzname 를 ì„¤ì •í•œë‹¤. 17. 2. 6ì ˆ [Time Zone Functions]
참조.
ì´ ì ˆì— ì„¤ëª…ëœ í•¨ìˆ˜ë“¤ì€ ë¬¸ìžì—´ë¡œ ì‹œê°„ê°’ë“¤ì„ í˜•ì‹í™”한다. ì´ë“¤ í•¨ìˆ˜ë“¤ì€ í—¤ë”íŒŒì¼ 'time. h'ì— ì„ ì–¸ë˜ì–´
있다.
함수 : char *asctime(const struct tm *brokentime)
- asctime 함수는 brokentimeì´ ê°€ë¦¬í‚¤ê³ ìžˆëŠ” broken-down ì‹œê°„ì„ í‘œì¤€ 형ì‹ì„ 가진 문ìžì—´ë¡œ
변환한다.
- "Tue May 21 13: 46: 22 1991\n"
- ì£¼ì•ˆì— ìžˆëŠ” ìš”ì¼ì˜ 약ìžëŠ”: `Sun', `Mon', `Tue', `Wed', `Thu' `Fri' ê·¸ë¦¬ê³ `Sat' ì´ë‹¤.
- ë‹¬ë“¤ì˜ ì•½ìžëŠ”: '`Jan', `Feb', 'Mar', 'Apr', 'May', Jun', 'Jul', 'Aug', 'Sep', 'Oct', Nov',
ê·¸ë¦¬ê³ 'Dec' ì´ë‹¤.
-
- ë°˜í™˜ê°’ì€ ì–´ë–¤ ë‚ ì§œì™€ 시간 í•¨ìˆ˜ë“¤ì˜ í˜¸ì¶œì— ì˜í•œ 결과로 ë®ì–´ì“°ê¸°ê°€ ëœ, ì •ì 으로 í• ë‹¹ëœ ë¬¸ìžì—´ì„
가리킨다. (그러나 ì–´ëŠ ë‹¤ë¥¸ í•¨ìˆ˜ë„ ì´ ë¬¸ìžì—´ì˜ ë‚´ìš©ì— ë§ì”Œìš°ê¸°ë¥¼ í• ìˆ˜ 없다. )
함수 : char *ctime(const time_t *time)
- ctime함수는 ì‹œê°„ê°’ì´ ë‹¬ë ¥ì‹œê°„(ì§€ì—시간) 형ì‹ìœ¼ë¡œ ì§€ì •ë˜ì—ˆë‹¤ëŠ” ê²ƒì„ ì œì™¸í•˜ê³ ëŠ”, asctimeê³¼
ìœ ì‚¬í•˜ë‹¤. ê·¸ê²ƒì€ asctime(localtime (time))ê³¼ 같다. ctime는 localtime으로 í•˜ê¸°ë•Œë¬¸ì— ë³€ìˆ˜
tznameì„ ì„¤ì •í•œë‹¤. 17. 2. 6ì ˆ [Time Zone Function] 참조.
함수 : size_t strftime(char *s, size_t size, const char *template, const struct tm
*brokentime)
- ì´ í•¨ìˆ˜ëŠ” sprintf 함수(7. 11ì ˆ [Formatted Input] 참조)와 ìœ ì‚¬í•˜ì§€ë§Œ, í˜•ì‹ í…œí”Œë¦¿ template안ì—
ë‚˜íƒ€ë‚ ìˆ˜ 있는 ë³€í™˜ì§€ì •ì€ ì‹œê°„ ë³€í™˜ì„ ìœ„í•´ì„œ ì •í•´ì§„ í˜„ìž¬ì˜ ì§€ì—ì‹œê°„ì— ë”°ë¥¸ brokentimeì˜
ë‚ ì§œì™€ ì‹œê°„ì˜ ìš”ì†Œë“¤ì„ í”„ë¦°íŠ¸í•˜ë„ë¡ íŠ¹ë³„í™”ë˜ì—ˆë‹¤. (19장 [Locales] 참조. ) templateì•ˆì— ë‚˜íƒ€ë‚œ
ë³´í†µì˜ ë¬¸ìžë“¤ì€ ì¶œë ¥ 문ìžì—´ sì— ë³µì‚¬ë˜ì–´ 진다; ì´ê²ƒì€ 다중 ë°”ì´íЏ 문ìžë“¤ë¡œ ì´ë£¨ì–´ì§„ 열들ì„
í¬í•¨í• 수 있다. ë³€í™˜ì§€ì •ìžëŠ” `%'ë¬¸ìž ë‹¤ìŒì— ë‚˜íƒ€ë‚˜ê³ , 다ìŒì²˜ëŸ¼ ì¶œë ¥ 문ìžì—´ì„ ì¡°ì •í•œë‹¤.
-
%a : í˜„ìž¬ì˜ ì§€ì—ì— ë§žëŠ” 약ìžë¡œ í‘œí˜„ëœ ìš”ì¼ì´ë¦„.
%A : 현재지ì—ì— ë§žëŠ” ì™„ì „í•œ ìš”ì¼ì´ë¦„.
%b : 현재지ì—ì— ë§žëŠ” 약ìžì¸ 달 ì´ë¦„.
%B : 현재지ì—ì— ë§žëŠ” ì™„ì „í•œ 달 ì´ë¦„.
%c : 현재 ì§€ì—ì„ ìœ„í•´ ì„ íƒëœ ë‚ ì§œì™€ 시간 표현.
%d : ì‹ì§„수로 표현ëœ(01ì—서 31ê¹Œì§€ì˜ ë²”ìœ„) 한달 ì•ˆì˜ ë‚ ì§œ.
%H : 24시간 시계를 사용해서(00ì—서 23ê¹Œì§€ì˜ ë²”ìœ„), ì‹ì§„수로 나타낸 시간.
%I : 12시간 시계를 사용해서(01ì—서 12ê¹Œì§€ì˜ ë²”ìœ„), ì‹ì§„수로 나타낸 시간.
%j : ì‹ì§„수(001ì—서 366ê¹Œì§€ì˜ ë²”ìœ„)로 í‘œí˜„ëœ ì¼ë…„ì•ˆì˜ ë‚ ìˆ˜.
%m : ì‹ì§„수(01ì—서 12ê¹Œì§€ì˜ ë²”ìœ„)로 í‘œí˜„ëœ ë‹¬.
%M : ì‹ì§„수로 í‘œí˜„ëœ ë¶„.
%p : 주어진 ì‹œê°„ê°’ì— ë§žëŠ”, `am'ë˜ëŠ” `pm' ë˜ëŠ” 현재지ì—ì— ë§žëŠ” ì—°ê´€ëœ ë¬¸ìžì—´.
%S : ì‹ì§„수로 í‘œí˜„ëœ ì´ˆ.
%U : 첫 번째 ì£¼ì˜ ì²« 번째 ë‚ ì¸ ì²« 번째 ì¼ìš”ì¼ì„ 기ì 으로 해서, ì‹ì§„수로 í‘œí˜„ëœ ì˜¬í•´ì˜ ì£¼ì˜ìˆ˜
%W : 첫 번째 ì£¼ì˜ ì²« ë²ˆì§¸ë‚ ì¸ ì²« 번째 월요ì¼ì„ 기ì 으로 해서, ì‹ì§„수로 í‘œí˜„ëœ ì˜¬í•´ì˜ ì£¼ì˜ ìˆ˜
%w : ì¼ìš”ì¼ì„ 0으로 한, ì‹ì§„수로 í‘œí˜„ëœ ìš”ì¼.
%x : 시간 ì—†ì´, 현재지ì—ì„ ìœ„í•´ ì˜ˆì•½ëœ ë‚ ì§œ 표현.
%X : ë‚ ì§œ ì—†ì´, 현재지ì—ì„ ìœ„í•´ ì˜ˆì•½ëœ ì‹œê°„ 표현.
%y : 세기(century)ì—†ì´(00ì—서 99ê¹Œì§€ì˜ ë²”ìœ„), ì‹ì§„수로 í‘œí˜„ëœ ì—°ë„.
%Y : 세기를 í¬í•¨í•´ì„œ, ì‹ì§„수로 í‘œí˜„ëœ ì—°ë„.
%Z : 시간대나 ì´ë¦„ ë˜ëŠ” 약ìž(시간대가 ê²°ì •ë 수 없다면 비워ë¼)
%% : ë¬¸ìž `%'
-
- size ì¸ìˆ˜ëŠ” ë„ ì¢…ë£Œë¬¸ìžë¥¼ í¬í•¨í•´ì„œ, ë°°ì—´ sì— ì €ìž¥ëœ ë¬¸ìžë“¤ì˜ 최대 개수를 나타내기 위해서
사용ë 수 있다. ë§Œì¼ í˜•ì‹í™”ëœ ì‹œê°„ì´ size í¬ê¸°ë³´ë‹¤ ë” ë§Žì€ ë¬¸ìžë“¤ì´ 필요하다면, 초과ë˜ëŠ”
문ìžë“¤ì€ ë²„ë ¤ì§„ë‹¤. strtimeì„ í†µí•œ ë°˜í™˜ê°’ì€ ë„ ì¢…ë£Œë¬¸ìžë¥¼ í¬í•¨í•˜ì§€ 않ì€, ë°°ì—´ sì— ì €ìž¥ëœ
문ìžë“¤ì˜ 개수ì´ë‹¤. ë§Œì¼ valueê°€ size와 같다면, ê·¸ ë°°ì—´ì´ ë„ˆë¬´ 작았ìŒì„ ì˜ë¯¸í•œë‹¤; ë‹¹ì‹ ì€ ë°°ì—´ì„
í¬ê¸°ë¥¼ í¬ê²Œ í•˜ê³ , strtime를 재 호출하ë¼. ë§Œì¼ sê°€ ë„ í¬ì¸í„°ë¼ë©´, strftimeì€ ì‹¤ì œë¡œ 아무 것ë„
ì“°ì§€ 않지만, ëŒ€ì‹ ì— ì“°ì—¬ì¡Œë˜ ë¬¸ìžë“¤ì˜ 개수를 반환한다. strftimeì— ëŒ€í•œ 예는 17. 2. 7ì ˆ [Time
Functions Example] 참조.
GNU 시스템ì—서, 사용ìžëŠ” TZ 환경변수로 시간대를 ì •í• ìˆ˜ 있다. 환경변수를 어떻게 ì„¤ì •í•˜ëŠ”ê°€ì—
대한 ì •ë³´ëŠ”, 22. 2ì ˆ [Environment Variables] 참조. 시간대를 억세스하기 위한 함수는 'time. h'ì—
ì„ ì–¸ë˜ì–´ 있다. TZ ë³€ìˆ˜ì˜ ê°’ì€ ì„¸ 가지 형ì‹ì¤‘ì— í•˜ë‚˜ê°€ ëœë‹¤. 첫 번째 형ì‹ì€ ì§€ì—시간대ì—서
ì¼ê´‘ì ˆì•½ì‹œê°„(ë˜ëŠ” ì¸ë¨¸íƒ€ìž„)ì´ ì—†ëŠ” ê³³ì—서 사용ëœë‹¤:
std offset
- std 문ìžì—´ì€ ì‹œê°„ëŒ€ì˜ ì´ë¦„ì„ ì •í•œë‹¤. ê·¸ê²ƒì€ ì„¸ ê°œ ì´ìƒì˜ 문ìžì—´ì˜ 길ì´ë¥¼ ê°€ì ¸ì•¼ë§Œ í•˜ê³ , ì½œë¡ ì´
ì„ í–‰ë˜ê±°ë‚˜, 숫ìž, 콤마, ë˜ëŠ” 플러스나 마ì´ë„ˆìФ 부호가 들어가 있으면 안 ëœë‹¤. ì§€ì—시간대 ì´ë¦„
사ì´ì— ê³µë°±ì´ ì—†ì–´ì•¼í•œë‹¤. ì´ëŸ¬í•œ ì œí•œë“¤ì€ ì •í™•í•˜ê²Œ ê·¸ ì§€ì •ì„ ë¶„ì„하기 위해 필요하다. offset는
í˜‘ì • ì„¸ê³„ì‹œê°„ì„ ì–»ê¸° 위하여 ì§€ì—ì‹œê°„ì— ë”해야만 하는 ì‹œê°„ê°’ì„ ì •í•œë‹¤. ê·¸ê²ƒì€ [+|-]hh[: mm[:
ss]]와 ê°™ì€ êµ¬ë¬¸ì´ë‹¤. ì´ê²ƒì€ ë§Œì¼ ì§€ì—시간대가 그리니치 ìžì˜¤ì„ (Prime Meridian)ì˜ ì„œìª½ì—
있다면 양수ì´ê³ , ë™ìª½ì— 있다면 ìŒìˆ˜ì´ë‹¤. ì‹œê°„ì€ 0ê³¼ 24ì˜ ì‚¬ì´ì— 있어야만 í•˜ê³ , ë¶„ê³¼ 초는 0ê³¼
59ì˜ ì‚¬ì´ì— 있어야만 한다.
-
- 예를 들어, ì¼ê´‘ì ˆì•½ì‹œê°„ì„ íƒí•˜ì§€ ì•Šê³ , ë™ë¶€í‘œì¤€ì‹œê°„ì„ ì–´ë–»ê²Œ ì •í•˜ëŠ”ì§€ëŠ” 다ìŒê³¼ 같다.
-
- EST+5
- ì¼ê´‘ì ˆì•½ì‹œê°„ì´ ìžˆëŠ” ê³³ì—서 사용ë˜ëŠ” ë‘ ë²ˆì§¸ 형ì‹:
std offset dst [offset], start[/time], end[/time]
- 처ìŒì˜ std 와 offsetì€ ìœ„ì— ì„¤ëª…ëœ ê²ƒì²˜ëŸ¼ 표준시간 대를 ì •í•œë‹¤. dst 문ìžì—´ê³¼ offsetì€
ì¼ê´‘ì ˆì•½ì‹œê°„ì˜ ì‹œê°„ëŒ€ì— ë§žëŠ” nameê³¼ offsetì„ ì •í•œë‹¤; ë§Œì¼ offsetì„ ìƒëžµí•˜ë©´, ë””í´íŠ¸ë¡œ
표준시간보다 한시간 앞으로 ì •í•´ì§„ë‹¤.
- ì§€ì •ìžì˜ 나머지는 ì¼ê´‘ì ˆì•½ì‹œê°„ì´ ìžˆëŠ” ê³³ì—ì„œì˜ ì„¤ëª…ì´ë‹¤. ì¼ê´‘ì ˆì•½ ì‹œê°„ì´ ì˜í–¥ì„ 미ì¹
때는 ì‹œìž‘í•„ë“œì— ìžˆê³ , 다시 표준시간으로 변환ë˜ì—ˆì„ 때는 ë í•„ë“œì— ìžˆë‹¤. ë‹¤ìŒ í˜•ì‹ë“¤ì€
ì´ë“¤ 필드를 위한 설명ì´ë‹¤.
Jn
- ì´ê²ƒì€ 1ê³¼ 365사ì´ì— 있는 ì–´ë–¤ ë‚ n으로, ìœ¨ë¦¬ìš°ìŠ¤ë ¥ì˜ ë‚ ì§œë¥¼ ì •í•œë‹¤. ìœ¤ë…„ì— ìžˆëŠ” 2ì›”
29ì¼ì€ ë”해지지 않는다.
n
- 0ê³¼ 365사ì´ì— 있는 ì–´ë–¤ ë‚ n으로, ìœ¨ë¦¬ìš°ìŠ¤ë ¥ì˜ ë‚ ì§œë¥¼ ì •í•œë‹¤. ìœ¤ë…„ì— ìžˆëŠ” 2ì›” 29ì¼ì€
ë”해진다.
Mm. w. d
- më‹¬ì˜ wì£¼ì˜ dë‚ . ë‚ d는 0(ì¼ìš”ì¼)ê³¼ 6사ì´ì˜ ê°’ì´ì–´ì•¼ 한다. 주 w는 반드시 1ê³¼ 5사ì´ì´ë‹¤;
주 1ì€ ê·¸ 달ì—서 ë‚ dê°€ ë°œìƒí•œ 첫 번째 주ì´ê³ , 주 5는 달ì—서 ë§ˆì§€ë§‰ë‚ dê°€ 있는 마지막
주ì´ë‹¤. 달 mì€ 1ê³¼ 12사ì´ì´ë‹¤. timeí•„ë“œë“¤ì€ ì§€ì—ì‹œê°„ì„ ë‹¤ë¥¸ 시간표현으로 ë³€í™˜í• ë•Œ
ì§€ì •í•œë‹¤. ë§Œì¼ ìƒëžµë˜ë©´, ë””í´íŠ¸ê°’ì€ 02: 00: 00ì´ë‹¤. 예를 들어, 미êµì—서 ì 당한
ì¼ê´‘ì ˆì•½ì‹œê°„ì´ í¬í•¨ëœ ë‚ ì§œë¡œ ë™ë¶€ì‹œê°„대를 ì§€ì •í•˜ëŠ” ê²ƒì´ ìžˆë‹¤. 보통 GMT로부터ì˜
offset는 5시간ì´ë‹¤; 그리니치 ìžì˜¤ì„ 으로부터 서쪽으로 있기 ë•Œë¬¸ì— ì–‘ìˆ˜ ê°’ì´ë‹¤. ì¸ë¨¸íƒ€ìž„ì€
4ì›” 첫 번째 ì¼ìš”ì¼ ì˜¤ì „ 2ì‹œì— ì‹œìž‘ë˜ê³ , 10ì›” 마지막 ì¼ìš”ì¼ ì˜¤ì „ 2ì‹œì— ë난다.
EST+5EDT, M4. 1. 0/M10. 5. 0
- 특별한 ì–´ëŠ ì§€ì—ì—서 ì¼ê´‘ì ˆì•½ì‹œê°„ì˜ ì˜ˆì •ì€ í•´ë§ˆë‹¤ 변경ëœë‹¤. ì •í™•í•˜ê²Œ í•˜ë ¤ë©´, ê·¸ ì§€ì—ì—
맞는 ì¼ê´‘ì ˆì•½ì‹œê°„ì˜ ì˜ˆì •ì— ê¸°ì´ˆí•˜ì—¬ ë‚ ì§œì™€ ì‹œê°„ì„ ë³€ê²½í•´ì•¼í•œë‹¤. ê·¸ë ‡ì§€ë§Œ, ì‹œìŠ¤í…œì€ ê·¸
ì˜ˆì •ì´ ì–´ë–»ê²Œ 변경ë˜ì—ˆëŠ”ì§€ë¥¼ ë‹¹ì‹ ì´ ì§€ì •í• ë„êµ¬ë“¤ì„ ê°€ì§€ê³ ìžˆì§€ 않다. ë‹¹ì‹ ì´ ì´ê²ƒì„ í•
수 있는 가장 ì¢‹ì€ ë°©ë²•ì€ í•˜ë‚˜ì˜ íŠ¹ë³„í•œ ì˜ˆì •ì„ ì§€ì •í•´ì„œ 하는 것ì´ë‹¤. 보통 í˜„ìž¬ì˜ ì‹œê°„ì„
í‘œì‹œí•˜ê³ ì•„ë¬´ëŸ° ë¬¸ì œê°€ ì—†ì„ ë•Œ, ì´ê²ƒì€ 다른 ë‚ ì§œë¡œ 변경하기 위해 사용ëœë‹¤.
세 번째 형ì‹ì€ ì´ì™€ 같다.
: characters
- ê°ê°ì˜ ìš´ì˜ì²´ì œë§ˆë‹¤ ì´ í˜•ì‹ì„ 다르게 í•´ì„한다. GNU C ë¼ì´ë¸ŒëŸ¬ë¦¬ì—서는, 문ìžë“¤ì€
시간대를 표현하는 파ì¼ì˜ ì´ë¦„으로 í•´ì„한다. ë§Œì¼ TZ 환경변수가 아무런 ê°’ë„ ê°€ì§€ê³ ìžˆì§€
않다면, ê·¸ 오í¼ë ˆì´ì…˜ì€ ë””í´íŠ¸ë¡œ 시간대를 ì •í•œë‹¤. ê° ìš´ì˜ì²´ì œëŠ” ë””í´íŠ¸ì‹œê°„ëŒ€ë¥¼ ì •í•˜ê¸°
위한 ìžì‹ ë‚˜ë¦„ëŒ€ë¡œì˜ ê·œì¹™ì„ ê°–ê³ ìžˆê³ , 그래서 우리가 ê·¸ë“¤ì— ëŒ€í•´ì„œ ë§í• 수 있는 것ì€
ì 다.
변수 : char *tzname[2]
- tzname ë°°ì—´ì€ ì‚¬ìš©ìžê°€ ì„ íƒí•œ 표준 시간대와 ì¼ê´‘ì ˆì•½ì‹œê°„ëŒ€ì˜ ì´ë¦„ë“¤ì„ í‘œì¤€ 세-문ìžë¡œ 가진 ë‘
ê°œì˜ ë¬¸ìžì—´ì„ ì €ìž¥í•œë‹¤. tzname[0]ì€ í‘œì¤€ì‹œê°„ëŒ€(예를 들어 "EST")ì˜ ì´ë¦„ì´ê³ , tzname[1]ì€
ì¼ê´‘ì ˆì•½ì‹œê°„ì´ ì‚¬ìš©ë 때 시간대를 위한 ì´ë¦„ì´ë‹¤(예를 들어, "EDT"). ì´ë“¤ì€ TZ 환경변수로부터
std 와 dst문ìžì—´ê³¼ 같다. tzname ë°°ì—´ì€ tzset, ctime, strftime, mktime, ë˜ëŠ” localtimeì´
호출ë 때마다 TZ 환경변수로 초기화ëœë‹¤.
함수 : void tzset(void)
- tzset함수는 TZ í™˜ê²½ë³€ìˆ˜ì˜ ê°’ìœ¼ë¡œ tzname변수를 초기화한다. ì´ê²ƒì€ ì‹œê°„ëŒ€ì— ì˜ì¡´í•˜ëŠ” 다른 시간
변환 함수들ì—서 사용ë 때 ìžë™ì 으로 호출ë˜ê¸° ë•Œë¬¸ì— ë‹¹ì‹ ì´ ì§ì ‘ ë‹¹ì‹ ì˜ í”„ë¡œê·¸ëž¨ì„ í†µí•´ì„œ
ì´ê²ƒì„ 부를 필요가 ì—†ì„ ê²ƒì´ë‹¤.
다ìŒì˜ ë³€ìˆ˜ë“¤ì€ ìœ ë‹‰ìŠ¤ 시스템 Vì™€ì˜ í˜¸í™˜ì„±ì„ ìœ„í•´ì„œ ì •ì˜ë˜ì—ˆë‹¤. ì´ë“¤ ë³€ìˆ˜ë“¤ì„ localtime 함수를
í˜¸ì¶œí•¨ìœ¼ë¡œì¨ ì„¤ì •ëœë‹¤.
변수 : longint timezone
- ì´ê²ƒì€ 그리니치 표준시와 ì§€ì— í‘œì¤€ 시간사ì´ì˜ ì°¨ì´ë¥¼ 초단위로 ì €ìž¥í•œë‹¤. 예를 들어, 미êµì—서
ë™ë¶€ì‹œê°„ëŒ€ì˜ ê°’ì€ 5*60*60ì´ë‹¤.
ì—ìžì£¼ : 아까 ë™ë¶€ì‹œê°„대가 그리니치 표준시와 5ì‹œê°„ì˜ ì°¨ì´ê°€ ë‚œë‹¤ê³ í–ˆìœ¼ë‹ˆê¹Œ. . . 5*60*60.
변수 : int daylight
- ì´ ë³€ìˆ˜ëŠ” ë§Œì¼ í‘œì¤€ ë¯¸êµ ì¼ê´‘ì ˆì•½ì‹œê°„ ê·œì¹™ì´ ì ìš©ëœë‹¤ë©´ 0ì´ ì•„ë‹Œ ê°’ì„ ê°€ì§„ë‹¤.
ì§€ì—시간과 ë‹¬ë ¥ì‹œê°„ í•¨ìˆ˜ë“¤ì˜ ëª‡ê°€ì§€ë¥¼ 사용하는 예를 보여주는 프로그램ì´ë‹¤.
- #include <time. h>
- #include <stdio. h>
-
- #define SIZE 256
-
- int
- main (void)
- {
- char buffer[SIZE];
- time_t curtime;
- struct tm *loctime;
-
- /* í˜„ìž¬ì˜ ì‹œê°„ì„ ì–»ì–´ë¼ */
- curtime = time (NULL);
-
- /* ì§€ì—시간 표현으로 ë³€í™˜í•˜ë¼ */
- loctime = localtime (&curtime);
-
- /* 표준 형ì‹ìœ¼ë¡œ ë‚ ì§œì™€ ì‹œê°„ì„ ì¶œë ¥í•˜ë¼. */
- fputs (asctime (loctime), stdout);
-
- /* 보기 ì¢‹ì€ í˜•ì‹ìœ¼ë¡œ ê·¸ê²ƒì„ ì¶œë ¥í•˜ë¼ */
- strftime (buffer, SIZE, "Today is %A, %B %d. \n", loctime);
- fputs (buffer, stdout);
- strftime (buffer, SIZE, "The time is %I: %M %p. \n", loctime);
- fputs (buffer, stdout);
- return 0;
- }
-
- 다ìŒê³¼ ê°™ì€ ì¶œë ¥ì„ ë§Œë“¤ì–´ë‚¸ë‹¤.
-
- Wed Jul 31 13: 02: 36 1991
- Today is Wednesday, July 31.
- The time is 01: 02 PM.
alarm ê³¼ setitimer í•¨ìˆ˜ë“¤ì€ ì–´ë–¤ ë¯¸ëž˜ì˜ ì‹œê°„ì— í”„ë¡œì„¸ìŠ¤ ê·¸ ìžì²´ì— ì¸í„°ëŸ½íŠ¸ë¥¼ 거는 메커니즘ì„
ì œê³µí•œë‹¤. ê·¸ë“¤ì€ íƒ€ì´ë¨¸ë¥¼ ì„¤ì •í•¨ìœ¼ë¡œì¨ ì´ë£¨ì–´ì§„다. 타ì´ë¨¸ê°€ ë나면, 프로세스는 ì‹ í˜¸ë¥¼ 받는다.
ê° í”„ë¡œì„¸ìŠ¤ëŠ” ìœ ìš©í•œ 세 가지 ë…립 간격 타ì´ë¨¸ë¥¼ 갖는다.
시계 ì‹œê°„ì„ ê³„ì‚°í•˜ëŠ” ì‹¤ì œ-시간 타ì´ë¨¸. ì´ íƒ€ì´ë¨¸ëŠ” ê·¸ ì‹œê°„ì´ ê²½ê³¼ë˜ë©´ 프로세스ì—게 SIGALRM
ì‹ í˜¸ë¥¼ 보낸다.
í”„ë¡œì„¸ìŠ¤ì— ì˜í•´ ì‚¬ìš©ëœ CPUì‹œê°„ì„ ì…ˆí•˜ëŠ” ê°€ìƒ íƒ€ì´ë¨¸. ì´ íƒ€ì´ë¨¸ëŠ” ê·¸ ì‹œê°„ì´ ê²½ê³¼ë˜ë©´ 프로세스ì—게
SIGVTALRM ì‹ í˜¸ë¥¼ 보낸다.
profiling 타ì´ë¨¸ëŠ” í”„ë¡œì„¸ìŠ¤ì— ì˜í•´ ì‚¬ìš©ëœ CPU 시간과 프로세스를 위한 시스템 호출ì—서 ì‚¬ìš©ëœ CPU
시간 ì–‘ìª½ì„ ê³„ì‚°í•œë‹¤.
ì´ íƒ€ì´ë¨¸ëŠ” ê·¸ ì‹œê°„ì´ ê²½ê³¼ë˜ì—ˆì„ 때, 프로세스ì—게 SIGPROF ì‹ í˜¸ë¥¼ 보낸다.
ë‹¹ì‹ ì€ ì–´ë–¤ 종류로 ì„¤ì •ëœ ì–´ëŠ ì£¼ì–´ì§„ ì‹œê°„ì— í•œê°€ì§€ì˜ íƒ€ì´ë¨¸ë§Œì„ ì‚¬ìš©í• ìˆ˜ 있다. ë§Œì¼ ë‹¹ì‹ ì´ ì•„ì§
경과ë˜ì§€ ì•Šì€ ì‹œê°„ì„ ê°€ì§„ 타ì´ë¨¸ë¥¼ ì„¤ì •í•˜ë©´, ê·¸ 타ì´ë¨¸ëŠ” 새로운 값으로 간단히 ìž¬ì„¤ì •ëœë‹¤. ë‹¹ì‹ ì€
setitimer ì´ë‚˜ alarmì„ í˜¸ì¶œí•˜ê¸° ì „ì— signalì´ë‚˜ sigactionì„ ì‚¬ìš©í•´ì„œ ì 당한 알람 ì‹ í˜¸ë¥¼ 위한
핸들러를 만들어야 í• ê²ƒì´ë‹¤. ê·¸ë ‡ì§€ 않다면, ì‹œê°„ì´ ê²½ê³¼ë˜ì—ˆì„ 때 ë°œìƒí• 수 있는 ì‚¬ê±´ë“¤ì˜ ì—°ê²°ì€
알람 ì‹ í˜¸ë“¤ì— ëŒ€í•œ ë””í´íЏ ë™ìž‘으로, í”„ë¡œê·¸ëž¨ì˜ ì¢…ê²°ì„ ë°œìƒì‹œí‚¬ 것ì´ë‹¤. 21장. [Signal Handling] 참조.
setitimer 함수는 ì•ŒëžŒì„ ì„¤ì •í•˜ê¸° 위해서 주요한 방법ì´ë‹¤. ì´ ë„구는 í—¤ë”íŒŒì¼ `sys/time. h'ì— ì„ ì–¸ë˜ì–´
있다. ì‹¤ì œ-시간 타ì´ë¨¸ë¥¼ ì„¤ì •í•˜ê¸° 위해서 간단한 ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ ì œê³µí•˜ëŠ” alarm 함수는 `unistd. h'ì—
ì„ ì–¸ë˜ì–´ 있다.
ë°ì´í„°íƒ€ìž… : struct itimerval
- ì´ êµ¬ì¡°ì²´ëŠ” 타ì´ë¨¸ê°€ 경과ë˜ëŠ” 때는 ì •í•˜ê¸° 위해서 사용ë˜ì–´ì§„다. ê·¸ê²ƒì€ ë‹¤ìŒê³¼ ê°™ì€ ë©¤ë²„ë“¤ì„
í¬í•¨í•˜ê³ 있다.
struct timeval it_interval
- ì´ê²ƒì€ ì—°ì†ì ì¸ íƒ€ì´ë¨¸ ì¸í„°ëŸ½íŠ¸ë“¤ 사ì´ì˜ 간격ì´ë‹¤. ë§Œì¼ 0ì´ë©´, alarmì€ ì˜¤ì§ í•œ 번만
보내질것ì´ë‹¤.
struct timeval it_value
- ì´ê²ƒì€ 첫 번째 타ì´ë¨¸ ì¸í„°ëŸ½íЏ 간격ì´ë‹¤. ë§Œì¼ 0ì´ë©´, ì•ŒëžŒì€ ë¶ˆê°€ëŠ¥í•˜ë‹¤. ë°ì´í„°íƒ€ìž… struct
timevalì€ 17. 2. 2ì ˆ [High-Resolution Calendar] ì— ì„ ì–¸ë˜ì–´ 있다.
함수 : int setitimer(int which, struct itimerval *old, struct itimerval *new )
- setitimer 함수는 newì— ë”°ë¥¸ ê²ƒì— ì˜í•´ ì •í•´ì§„ 타ì´ë¨¸ë¥¼ ì„¤ì •í•œë‹¤. which ì¸ìˆ˜ëŠ” ITIMER_REAL,
ITIMER_VIRTUAL, ë˜ëŠ”, ITIMER_PROF ì¤‘ì˜ í•œ ê°’ì„ ê°€ì§ˆ 수 있다. ë§Œì¼ oldê°€ ë„ í¬ì¸í„°ê°€
아니ë¼ë©´, setitimer ì€ ê·¸ê²ƒì´ ê°€ë¦¬í‚¤ê³ ìžˆëŠ” êµ¬ì¡°ì²´ì— ê°™ì€ ì¢…ë¥˜ì˜ ì „ì— ê²½ê³¼ë˜ì§€ ì•Šì•˜ë˜ ì–´ëŠ
타ì´ë¨¸ì— 대한 ì •ë³´ë¥¼ 반환한다.
-
- 성공하면 ë°˜í™˜ê°’ì€ 0ì´ê³ , 실패하면 -1ì´ë‹¤. 다ìŒì˜ errno는 ì´ í•¨ìˆ˜ë¥¼ 위해 ì •ì˜ëœ ì—러ìƒí™©ì´ë‹¤.
EINVAL : 타ì´ë¨¸ì˜ ê°„ê²©ì´ ë„ˆë¬´ 길었다.
함수 : int getitimer(int which, struct itimerval *old)
- getitimer 함수는 oldê°€ ê°€ë¦¬í‚¤ê³ ìžˆëŠ” êµ¬ì¡°ì²´ì— ì˜í•´ ì •í•´ì§„ 타ì´ë¨¸ì— 대한 ì •ë³´ë¥¼ ì €ìž¥í•œë‹¤.
-
- 반환값과 ì—러ìƒí™©ë“¤ì€ setitimer와 같다.
ITIMER_REAL
- ì´ ìƒìˆ˜ëŠ” ì‹¤ì œ-시간 타ì´ë¨¸ë¡œ ì •í•˜ê¸° 위해서, setitimer와 getitimer 함수들ì—서 which
ì¸ìˆ˜ë¡œì¨ 사용ë 수 있다.
ITIMER_VIRTUAL
- ì´ ìƒìˆ˜ëŠ” ê°€ìƒ íƒ€ì´ë¨¸ë¡œ ì •í•˜ê¸° 위해서, setitimer와 getitimer 함수들ì—서 which ì¸ìˆ˜ë¡œì¨
사용ë 수 있다.
ITIMER_PROF
- ì´ ìƒìˆ˜ëŠ” profiling 타ì´ë¨¸ë¡œ ì •í•˜ê¸° 위해서, setitimer와 getitimer 함수들ì—서 which
ì¸ìˆ˜ë¡œì¨ 사용ë 수 있다.
함수 : unsigned int alarm(unsigned int seconds)
- alarm 함수는 초단위로 secondsê°€ 경과ë˜ë„ë¡ ì‹¤ì œ-시간 타ì´ë¨¸ë¥¼ ì„¤ì •í•œë‹¤. ë§Œì¼ ë‹¹ì‹ ì´ í˜„ì¡´í•˜ëŠ”
alarmì„ ì·¨ì†Œí•˜ê¸¸ ì›í•œë‹¤ë©´, ë‹¹ì‹ ì€ secondsì¸ìˆ˜ë¥¼ 0으로 해서 alarmì„ í˜¸ì¶œí•˜ë©´ ëœë‹¤. 반환값ì€
미리 호출ëë˜ alarmì—서 몇초가 남았는지를 가리킨다. ë§Œì¼ ë¯¸ë¦¬ í˜¸ì¶œëœ alarmì´ ì—†ë‹¤ë©´, alarmì€
0ì„ ë°˜í™˜í•œë‹¤. alarm함수는 ì´ì²˜ëŸ¼ setitimerì— ì˜í•˜ì—¬ ì •ì˜ë 수 있다.
-
- unsigned int alarm (unsigned int seconds)
- {
- struct itimerval old, new;
- new. it_interval. tv_usec = 0;
- new. it_interval. tv_sec = 0;
- new. it_value. tv_usec = 0;
- new. it_value. tv_sec = (long int) seconds;
- if (setitimer (ITIMER_REAL, &new, &old) < 0)
- return 0;
- else
- return old. it_value. tv_sec;
- }
-
- alarm 함수를 사용하는 예는 21. 4. 1ì ˆ [Handler Returns] ì—서 ë³´ì—¬ì£¼ê³ ìžˆë‹¤. ë§Œì¼ ë‹¹ì‹ ì´ ì£¼ì–´ì§„
시간(초단위ì˜)ë™ì•ˆ ë‹¹ì‹ ì˜ í”„ë¡œì„¸ìŠ¤ê°€ 기다리기를 ì›í•œë‹¤ë©´ sleep 함수를 ì‚¬ìš©í• ìˆ˜ ìžˆì„ ê²ƒì´ë‹¤.
17. 4ì ˆ[Sleeping] 참조.
- ë‹¹ì‹ ì€ íƒ€ì´ë¨¸ê°€ 경과ë˜ì—ˆì„ 때, ì •í™•í•˜ê²Œ ë„ì°©ëœ ì‹ í˜¸ë¥¼ ì…€ 수 ì—†ì„ ê²ƒì´ë‹¤. 멀티프로세싱
환경ì—서는 ì–´ëŠ ì •ë„ì˜ ì§€ì—°ì´ ìžˆê¸° 때문ì´ë‹¤.
ì´ì‹ì„± 노트: setitimer 와 getitimer í•¨ìˆ˜ë“¤ì€ BSD Unix로부터 ì™”ê³ , alarm 함수는 POSIX. 1 표준으로
ì •í•´ì ¸ìžˆë‹¤. setitimer ì€ alarm보다는 ë” ê°•ë ¥í•˜ì§€ë§Œ, alarmì´ ë” ê´‘ë²”ìœ„í•˜ê²Œ ì“°ì¸ë‹¤.
sleep 함수는 ì§§ì€ ì‹œê°„ë™ì•ˆ ê·¸ í”„ë¡œê·¸ëž¨ì„ ê¸°ë‹¤ë¦¬ê²Œ 하는 간단한 ë°©ë²•ì„ ì œê³µí•œë‹¤. ë§Œì¼ ë‹¹ì‹ ì˜
í”„ë¡œê·¸ëž¨ì´ ì‹ í˜¸ë“¤ì„ ì‚¬ìš©í•˜ì§€ 않는다면( 종료를 ì œì™¸í•˜ê³ ), ë‹¹ì‹ ì€ sleepê°€ ì •í•´ì§„ 시간ë™ì•ˆì— 확실하게
기다린다는 ê²ƒì„ ê¸°ëŒ€í• ìˆ˜ 있다. ê·¸ë ‡ì§€ 않다면, sleep는 ë§Œì¼ ì‹ í˜¸ê°€ ë„착한다면 곧바로 반환ë 수 있다;
ë§Œì¼ ë‹¹ì‹ ì´ ì‹ í˜¸ì— ìƒê´€ì—†ì´ 주어진 시간ë™ì•ˆ 기다리기를 ì›í•œë‹¤ë©´ select( 8. 6ì ˆ [Waiting for I/O]
참조. )를 ì‚¬ìš©í•˜ê³ , 기다리는 ì–´ë– í•œ ê¸°ìˆ ìžë„ ì§€ì •í•˜ì§€ ë§ì•„ë¼.
함수 : unsigned int sleep (unsigned int seconds)
- sleep 함수는 secondsë™ì•ˆ 기다리거나, 첫 번째 ë°œìƒí•œ ì‹ í˜¸ê°€ ë„ì°©ë 때까지 기다린다. ë§Œì¼ sleep
함수가 ìš”ì²ëœ ì‹œê°„ì´ ê²½ê³¼ë˜ì—ˆê¸° ë•Œë¬¸ì— ë°˜í™˜í–ˆë‹¤ë©´, ë°˜í™˜ê°’ì€ 0ì´ë‹¤. ë§Œì¼ ì‹ í˜¸ê°€ ë„ì°©ë˜ì–´ì„œ
반환했다면, ê·¸ ë°˜í™˜ê°’ì€ ì•„ì§ ê²½ê³¼ë˜ì§€ ì•Šê³ ë‚¨ì€ ì‹œê°„ì˜ ê°’ì´ë‹¤. sleep 함수는 `unistd. h'ì—
ì„ ì–¸ë˜ì–´ 있다.
-
- sleepê°€ 0ì´ ì•„ë‹Œ ê°’ì„ ë°˜í™˜í–ˆì„ ë•Œ, ê·¸ ë°˜í™˜ê°’ì„ ì‚¬ìš©í•´ì„œ ì •í•´ì§„ 시간ë™ì•ˆ 다시 기다리ë„ë¡
sleep를 ìž¬í˜¸ì¶œí•˜ë ¤ëŠ” ìœ í˜¹ì— ì €í•하ë¼. ì´ê²ƒì€ 빈번하게 ë„착한 ì‹ í˜¸ë“¤ë§Œí¼ ì •í™•í•˜ê²Œ 길어진 ì–´ë–¤
시간ë™ì•ˆ ìž‘ì—…í• ê²ƒì´ë‹¤. 그러나 ê° ì‹ í˜¸ëŠ” ê·¸ 부가ì ì¸ ì‹œê°„(ì´ˆ)으로 ì¸í•´ì„œ ì›ëž˜ ì •í•´ì§„ 기다림ì˜
시간보다 길어지게 í• ê²ƒì´ë‹¤.
-
- ê¸°ë‹¤ë¦¼ì´ ì–¼ë§ˆë‚˜ 길어지거나, 짧아질 수 ìžˆëŠ”ì§€ì— ëŒ€í•œ 아무런 ì œí•œì´ ì—†ëŠ” ì–´ë–¤ ì‹ í˜¸ë“¤ì´
ë¶ˆí–‰í•˜ê²Œë„ ë¹ ë¥´ê²Œ ì—°ì†ì 으로 ë°œìƒí•œë‹¤ê³ ê°€ì •í•˜ë¼. ëŒ€ì‹ ì—, ê·¸ í”„ë¡œê·¸ëž¨ì´ ê¸°ë‹¤ë¦¼ì„ ë©ˆì¶”ê²Œ ëœ ê·¸
ì‹œê°„ì„ ê³„ì‚°í•˜ê³ , 다시 남아있는 시간ë™ì•ˆ ê¸°ë‹¤ë¦¼ì„ ë‹¤ì‹œ 시ë„하ë„ë¡ í•˜ë¼. ì´ê²ƒì€ 1ì´ˆë³´ë‹¤ë„ ë”
ë§Žì´ ì‹œê°„ì°¨ì´ê°€ 나지 ì•Šì„ ê²ƒì´ë‹¤. ë” ì ì€ ì‹œê°„ë™ì•ˆ ìž‘ì—…í•˜ë ¤ë©´, ë‹¹ì‹ ì€ select를 ì‚¬ìš©í•˜ê³ , 꽤
ì •í™•í•œ 시간ë™ì•ˆ 기다리게 í• ìˆ˜ 있다. ( ë¬¼ë¡ , ë©€í‹°ìœ ì € 시스템ì—서 ê·¸ 기계가 단지 한
ì‘ìš©í”„ë¡œê·¸ëž¨ì„ ìœ„í•´ì„œ 사용ë˜ì§€ 않는다면, í”¼í• ìˆ˜ 없는 부가ì ì¸ ì§€ì—°ì„ ë°œìƒë 것ì´ë‹¤, ë‹¹ì‹ ì´
ê·¸ê²ƒì„ í”¼í• ìˆ˜ 있는 ë°©ë²•ì€ ì•„ë¬´ ê²ƒë„ ì—†ë‹¤. )
-
- ì–´ë–¤ 시스템ìƒì—서, ë§Œì¼ ë‹¹ì‹ ì˜ í”„ë¡œê·¸ëž¨ì—서 SIGALRMì„ ì‚¬ìš©í•œë‹¤ë©´ sleep는 ì´ìƒí•˜ê²Œ ë™ìž‘í•
수 있다. 심지어 sleepê°€ 호출ë˜ì—ˆì„ 때 SIGALRM ì‹ í˜¸ê°€ 무시ë˜ê±°ë‚˜ ë¸”ë¡ ëœë‹¤ë©´, sleep는
SIGALRM ì‹ í˜¸ ë•Œë¬¸ì— ì‹œê¸°ìƒì¡°ì 으로 반환ë 것ì´ë‹¤. ë§Œì¼ ë‹¹ì‹ ì´ í”„ë¡œì„¸ìŠ¤ê°€ 기다리ê³
있는(sleeping)ë™ì•ˆ ë°°ë‹¬ëœ SIGALRM ì‹ í˜¸ì™€ SIGALRM ì‹ í˜¸ë¥¼ 위한 핸들러를 만들었다면, ê·¸
ë™ìž‘ì€ ë‹¹ì‹ ì´ ë§Œë“ ì‹ í˜¸ í•¸ë“¤ëŸ¬ì— ê·¸ 처리를 맡기는 ëŒ€ì‹ ì— sleepì˜ ë°˜í™˜ì„ ë°œìƒì‹œí‚¬ 것ì´ë‹¤.
ê·¸ë¦¬ê³ ë§Œì¼ sleepê°€ alarmì„ ìš”ì²í•˜ê±°ë‚˜ SIGALRMì˜ ì²˜ë¦¬ë¥¼ ì„ íƒí•˜ëŠ” 핸들러가 가진 ì‹ í˜¸ì— ì˜í•´
ì¸í„°ëŸ½íЏ ëœë‹¤ë©´, ì´ í•¸ë“¤ëŸ¬ì™€ sleep는 ë°©í•´ë 것ì´ë‹¤. GNU 시스템ì—서는, sleepê°€ SIGALRMì—
ì˜í•˜ì—¬ 작업하지 않기 때문ì—, sleep와 SIGALRMì„ ê°™ì€ í”„ë¡œê·¸ëž¨ì—서 사용하는 ê²ƒì´ ì•ˆì „í•˜ë‹¤.
함수 getrusage 와 ë°ì´í„°íƒ€ìž… struct rusage는 í”„ë¡œì„¸ìŠ¤ì˜ ì‚¬ìš©í˜•íƒœë¥¼ 시험하기 위해서 사용ëœë‹¤.
ê·¸ë“¤ì€ `sys/resource. h'ì— ì„ ì–¸ë˜ì–´ 있다.
함수 : int getrusage(int processes, struct rusage *rusage)
- ì´ í•¨ìˆ˜ëŠ” processesì— ì˜í•´ ì •í•´ì§„ ê·¸ 프로세스를 위해 ì‚¬ìš©ëœ ê²ƒì„ *rusageì— ì •ë³´ë¥¼ ì €ìž¥í•˜ì—¬,
ë³´ê³ í•œë‹¤. ëŒ€ë¶€ë¶„ì˜ ì‹œìŠ¤í…œì—서, processes는 ì˜¤ì§ ë‘ ê°œì˜ ìœ ìš©í•œ ê°’ì„ ê°€ì§„ë‹¤:
RUSAGE_SELF
- 단지 í˜„ìž¬ì˜ í”„ë¡œì„¸ìŠ¤.
RUSAGE_CHILDREN
- ì´ë¯¸ ì¢…ë£Œëœ ëª¨ë“ ìžì‹ 프로세스(ì§ì ‘ ê³¼ ê°„ì ‘).
- GNU 시스템ì—서, 프로세스 ID를 ì •í•¨ìœ¼ë¡œ 해서, íŠ¹ì •í•œ ìžì‹ í”„ë¡œì„¸ìŠ¤ì— ëŒ€í•´ì„œ ì¡°ì‚¬í• ìˆ˜
있다. getrusageì˜ ë°˜í™˜ê°’ì€ ì„±ê³µí•˜ë©´ 0ì´ê³ , 실패하면 -1ì´ë‹¤.
EINVAL
- processes ì¸ìˆ˜ê°€ ìœ ìš©í•˜ì§€ 않다.
íŠ¹ì •í•œ ìžì‹ 프로세스를 위한 사용형태를 얻는 ë°©ë²•ì€ wait4 함수를 통해서 í• ìˆ˜ 있는ë°, ê·¸ 함수는 ìžì‹
프로세스가 종료ë˜ì—ˆì„ 때 ìžì‹ 프로세스를 위한 ëª¨ë“ ê²ƒì„ ë°˜í™˜í•œë‹¤. 23. 8ì ˆ [BSD Wait Functions]
참조.
ë°ì´í„°íƒ€ìž… : struct rusage
- ì´ ë°ì´í„°íƒ€ìž…ì€ ë‹¤ì–‘í•œ ì¢…ë¥˜ì˜ ìžì›ì— 대한 ì‚¬ìš©ëŸ‰ì„ ê¸°ë¡í•œë‹¤. ì´ê²ƒì€ 다ìŒê³¼ ê°™ì€ ë©¤ë²„ë“¤ì„
갖으며, 다른 ê²ƒë„ ê°€ëŠ¥í•˜ë‹¤.
-
- struct timeval ru_utime : ì‚¬ìš©ëœ ì‚¬ìš©ìž ì‹œê°„.
- struct timeval ru_stime : ì‚¬ìš©ëœ ì‹œìŠ¤í…œ 시간.
- long ru_majflt : í´íŠ¸ì˜ ê°œìˆ˜.
- long ru_inblock : 블ë¡ëœ ìž…ë ¥ ëª…ë ¹ì˜ ê°œìˆ˜.
- long ru_oublock : 블ë¡ëœ ì¶œë ¥ ëª…ë ¹ì˜ ê°œìˆ˜.
- long ru_msgsnd : ë³´ëƒˆë˜ ë©”ì‹œì§€ì˜ ê°œìˆ˜.
- long ru_msgrcv : ë°›ì•˜ë˜ ë©”ì‹œì§€ì˜ ê°œìˆ˜.
- long ru_nsignals : ë°›ì•˜ë˜ ì‹œê·¸ë„ì˜ ê°œìˆ˜.
사용형태를 시험하는 함수로는 vtimesë„ ìžˆì§€ë§Œ 여기서 설명하지는 않는다. ê·¸ê²ƒì€ `sys/vtimes. h'ì—
ì„ ì–¸ë˜ì–´ 있다.
ë‹¹ì‹ ì€ í”„ë¡œì„¸ìŠ¤ì˜ ìžì› ì‚¬ìš©ì— ëŒ€í•´ì„œ ì œí•œì„ ê°€í• ìˆ˜ 있다. ê·¸ 프로세스가 ì œí•œì„ ë„˜ì–´ì„œë ¤ 시ë„í• ë•Œ,
ì œí•œì— ë”°ë¼ì„œ ê·¸ 프로세스는 ì‹ í˜¸ë¥¼ 받거나, 아니면 시ë„í–ˆë˜ ê²ƒì˜ ì‹¤íŒ¨ë¡œ ì¸í•œ 시스템 í˜¸ì¶œì´ ë
것ì´ë‹¤. ê° í”„ë¡œì„¸ìŠ¤ëŠ” ê·¸ 부모 프로세스로부터 처ìŒì—는 ì œí•œì„ ìƒì†ë°›ì§€ë§Œ, 그후ì—는 ê·¸ë“¤ì„ ë³€ê²½ í• ìˆ˜
있다. ì´ ì ˆì— ìžˆëŠ” ì‹¬ë³¼ë“¤ì€ `sys/resource. h'ì— ì •ì˜ë˜ì–´ 있다.
함수 : int getrlimit(int resource, struct rlimit *rlp)
- ìžì› resourceì˜ í˜„ìž¬ê°’ê³¼ 최대 ê°’ì„ ì½ê³ , ê·¸ë“¤ì„ *rlpì— ì €ìž¥í•œë‹¤. 성공하면 ë°˜í™˜ê°’ì€ 0ì´ê³
실패하면 -1ì´ë‹¤. ë°œìƒ ê°€ëŠ¥í•œ ì—러 ìƒí™©ì€ EFAULTë¿ì´ë‹¤.
함수 : int setrlimit(int resource, struct rlimit *rlp)
- *rlpì— ìžˆëŠ” 것으로 ìžì› resourceì˜ í˜„ìž¬ê°’ê³¼ 최대 ê°’ì„ ì„¤ì •í•œë‹¤. 성공하면 ë°˜í™˜ê°’ì€ 0ì´ê³
실패하면 -1ì´ë‹¤. 다ìŒì˜ errno는 가능한 ì—러ìƒí™©ì´ë‹¤.
EPERM
- ë‹¹ì‹ ì´ í—ˆìš©ëœ ìµœëŒ€ ì œí•œê°’ì„ ë³€ê²½í•˜ë ¤ 시ë„했지만, ë‹¹ì‹ ì€ ê·¸ë ‡ê²Œ í• ë§Œí•œ íŠ¹ê¶Œì„ ë¶€ì—¬ë°›ì§€
않았다.
ë°ì´í„°íƒ€ìž… : struct rlimit
- ì´ êµ¬ì¡°ì²´ëŠ” ì œí•œ ê°’ë“¤ì„ ë°›ê¸° 위해서 getrlimitì—서 사용ë˜ê³ , ì œí•œ ê°’ë“¤ì„ ì •í•˜ê¸° 위해서
setrlimitì—서 사용ëœë‹¤. ë‘ ê°œì˜ í•„ë“œë¥¼ 갖는다.
rlim_cur : ì§ˆë¬¸ì— ëŒ€í•œ ì œí•œì˜ í˜„ìž¬ê°’.
rlim_max
- ì§ˆë¬¸ì— ëŒ€í•œ ì œí•œì˜ ìµœëŒ€ 허용값. ë‹¹ì‹ ì€ ì´ ìµœëŒ“ê°’ 보다 í° ìˆ˜ë¡œ ì œí•œì˜ í˜„ìž¬ê°’ì„ ì„¤ì •í• ìˆ˜
없다. ì˜¤ì§ ìŠˆí¼ ìœ ì €ë§Œì´ ìµœëŒ€ í—ˆìš©ê°’ì„ ë³€ê²½í• ìˆ˜ 있다.
getrlimitì—서 ê·¸ 구조체는 ì¶œë ¥ìœ¼ë¡œì„œ, í˜„ìž¬ê°’ë“¤ì„ ë°›ëŠ”ë‹¤. setrlimitì—서 ê·¸ 구조체는 새로운 값들ì„
ì •í•˜ëŠ”ë° ì‚¬ìš©ëœë‹¤. ë‹¹ì‹ ì´ ì œí•œì„ ì •í• ìˆ˜ 있는 ìžì›ì˜ 리스트ì´ë‹¤. ê·¸ë“¤ì€ ë°”ì´íŠ¸ë¡œ ê³„ì‚°ëœ í¬ê¸°ì´ë‹¤.
RLIMIT_CPU
- ê·¸ 프로세스가 ì‚¬ìš©í• ìˆ˜ 있는 cpu timeì˜ ìµœëŒ€ëŸ‰. ë§Œì¼ ì´ê²ƒë³´ë‹¤ ë” ê¸¸ê²Œ 실행한다면,
SIGXCPUë¼ëŠ” ì‹ í˜¸ê°€ ë°œìƒí•œë‹¤. ê°’ì€ ì´ˆë‹¨ìœ„ë¡œ ê³„ì‚°ëœ ê²ƒì´ë‹¤. 21. 2. 7ì ˆ [Nonstandard Signals]
참조.
RLIMIT_FSIZE
- ê·¸ 프로세스가 만들 수 있는 파ì¼ì˜ 최대 í¬ê¸°. ì´ê²ƒë³´ë‹¤ í° íŒŒì¼ì„ ë§Œë“¤ë ¤í•˜ë©´ SIGXFSZë¼ëŠ”
ì‹ í˜¸ê°€ ë°œìƒëœë‹¤. 21. 2. 7ì ˆ [Nonstandard Siganls] 참조.
RLIMIT_DATA
- 프로세스가 ì‚¬ìš©í• ìˆ˜ 있는 ë°ì´í„° ë©”ëª¨ë¦¬ì˜ ìµœëŒ€í¬ê¸°. ë§Œì¼ ê·¸ 프로세스가 ì´ ì–‘ì„ ì´ˆê³¼í•˜ëŠ”
ë°ì´í„° 메모리를 í• ë‹¹í•˜ë ¤ 시ë„하면 ê·¸ í• ë‹¹ì€ ì‹¤íŒ¨í•œë‹¤.
RLIMIT_STACK
- 프로세스를 위한 최대 ìŠ¤íƒ í¬ê¸°. ë§Œì¼ í”„ë¡œì„¸ìŠ¤ê°€ ì´ í¬ê¸°ë³´ë‹¤ í¬ê²Œ 스íƒì„ í™•ìž¥í•˜ë ¤ 시ë„한다면,
SIGSEGV ì‹ í˜¸ê°€ ë°œìƒëœë‹¤. 21. 2. 1ì ˆ [Program Error Signals] 참조.
RLIMIT_CORE
- ì´ í”„ë¡œì„¸ìŠ¤ê°€ 만들 수 있는 최대 í¬ê¸° 코어 파ì¼. ë§Œì¼ í”„ë¡œì„¸ìŠ¤ê°€ 종료ë˜ê³ 코어파ì¼ì´
ë§Œë“¤ì–´ì¡Œê³ , ì´ ìµœëŒ€í¬ê¸°ê°€ 충분하지 않다면, 코어 파ì¼ì€ ìž˜ë ¤ì§„ë‹¤.
RLIMIT_RSS
- ì´ í”„ë¡œì„¸ìŠ¤ê°€ ì–»ì„ ìˆ˜ 있는 물리ì ë©”ëª¨ë¦¬ì˜ ìµœëŒ€ëŸ‰. ì´ ìˆ˜ì¹˜ëŠ” 시스템 스케줄러와 메모리
í• ë‹¹ìžë¥¼ 위한 ì •ë³´ê°€ ëœë‹¤; ì‹œìŠ¤í…œì€ ë©”ëª¨ë¦¬ê°€ 남아있는 ì–‘ì´ ìžˆì„ ë•Œ ê·¸ 프로세스ì—게 ë” ë§Žì€
메모리를 줄 ìˆ˜ë„ ìžˆë‹¤.
RLIMIT_OPEN_FILES
- 프로세스가 ê°œë°©í• ìˆ˜ 있는 파ì¼ì˜ 최대개수. ë§Œì¼ ì´ê²ƒë³´ë‹¤ ë” ë§Žì´ ê°œë°©í•˜ë ¤ 한다면, EMFILEë¼ëŠ”
ì—러코드가 ë°œìƒëœë‹¤. 2. 2ì ˆ [Error Codes] 참조.
RLIM_NLIMITS
- 다른 ìžì› ì œí•œì˜ ê°œìˆ˜. ì–´ëŠ ìœ ìš©í•œ ìžì› 피연산ìžëŠ” RLIM_NMLIMITS보다 ì ì„ ê²ƒìž„ì´
틀림없다.
ìƒìˆ˜ : int RLIM_INFINITY
- ì´ ìƒìˆ˜ëŠ” setrlimitì—서 ì œí•œ 값으로 사용ë 때 "무한대"ì˜ ê°’ì„ ë‚˜íƒ€ë‚¸ë‹¤.
- ìžì› ì œí•œì„ ì„¤ì •í•˜ëŠ” 함수는 ulimit와 vlimitê°€ 있지만 여기서 설명ë˜ì§€ 않았다.
vlimit는`sys/vlimit. h'ì— ì„ ì–¸ë˜ì–´ ìžˆê³ BSD로부터 왔다.
ì—¬ëŸ¬ê°œì˜ í”„ë¡œì„¸ìŠ¤ë“¤ì´ ì‹¤í–‰í•˜ë ¤ 시ë„ë 때, 그들 ê°ê°ì´ 가진 ìš°ì„ ê¶Œì´ ê·¸ 프로세스가 ê°€ì ¸ê°ˆ CPUì˜
ë¶„í• ì„ ê²°ì •í•œë‹¤. ì´ ì ˆì€ ë‹¹ì‹ ì´ ì–´ë–»ê²Œ í”„ë¡œì„¸ìŠ¤ì˜ ìš°ì„ ê¶Œì„ ì•Œì•„ë‚´ê³ ì„¤ì •í• ìˆ˜ 있는지를 설명한다.
ì´ë“¤ 함수들과 매í¬ë¡œ 모ë‘는 `sys/resource. hì— ì„ ì–¸ë˜ì–´ 있다.
ìœ ìš©í•œ ìš°ì„ ê¶Œ ê°’ë“¤ì˜ ë²”ìœ„ëŠ” ìš´ì˜ì²´ì œì— ì˜ì¡´ë˜ì§€ë§Œ, ì¼ë°˜ì 으로 -20ì—서 20까지ì—서 실행ëœë‹¤. ë‚®ì€
ìš°ì„ ê¶Œ ê°’ì€ ê·¸ 프로세스가 ë” ìžì£¼ 실행ë¨ì„ ì˜ë¯¸í•œë‹¤. ì´ë“¤ ìƒìˆ˜ë“¤ì€ ìš°ì„ ê¶Œ ê°’ë“¤ì˜ ë²”ìœ„ë¥¼ 설명한다.
PRIO_MIN
- ìœ ìš©í•œ ìš°ì„ ê¶Œì˜ ê°€ìž¥ ìž‘ì€ ê°’.
PRIO_MAX
- ìœ ìš©í•œ ìš°ì„ ê¶Œì˜ ê°€ìž¥ í° ê°’.
** ì—ìžì£¼ : ì›ì„œì—는 PRIO_MAXì— The smallestë¼ê³ ë˜ì–´ 있었습니다. 하지만 ì €ëŠ” í‹€ë ¸ë‹¤ëŠ” íŒë‹¨ì„
ê°–ê³ largestë¼ê³ ê³ ì³¤ìŒì„ ì•Œë ¤ 드립니다.
함수 : int getpriority(int class, int id)
- 프로세스들 classì˜ ìš°ì„ ê¶Œì„ ì½ëŠ”ë‹¤; class와 id는 ë°‘ì— ìžˆëŠ” 것 ì¤‘ì— í•œê°€ì§€ë¡œ ì •í•œë‹¤.
-
- 성공하면 ë°˜í™˜ê°’ì„ ìš°ì„ ê¶Œ ê°’ì´ê³ , 실패하면 -1ì„ ë°˜í™˜í•œë‹¤. 다ìŒì˜ errno는 ì´ í•¨ìˆ˜ì—서 가능한
ì—러ìƒí™©ì´ë‹¤.
ESRCH
- class와 idì˜ ì¡°í•©ì´ í˜„ì¡´í•˜ê³ ìžˆëŠ” ì–´ë–¤ í”„ë¡œì„¸ìŠ¤ì™€ë„ ë§žì§€ê°€ 않는다.
EINVAL
- classì˜ ê°’ì´ ìœ ìš©í•˜ì§€ 않다.
- ë°˜í™˜ê°’ì´ -1ì¼ ë•Œ, ê·¸ê²ƒì€ ì‹¤íŒ¨í–ˆìŒì„ 알리거나, ë˜ëŠ” ê·¸ê²ƒì´ ìš°ì„ ê¶Œì˜ ê°’ì´ ë 수 있다.
ì´ëŸ´ë•Œë¥¼ 대비한 ì •í™•í•œ ë°©ë²•ì€ getpriority를 호출하기 ì „ì— errno = 0으로 ì„¤ì •ì„ í•´ë†“ìœ¼ë©´,
실패를 íŒë‹¨í•˜ëŠ” 조건으로 errno != 0 ì„ ì‚¬ìš©í• ìˆ˜ 있다.
함수 : int setpriority(int class, int id, int priority)
- 프로세스들 classì˜ ìš°ì„ ê¶Œì„ ì½ëŠ”ë‹¤(ì„¤ì •í•œë‹¤. ); class 와 id는 ë°‘ì— ê²ƒ ì¤‘ì— í•˜ë‚˜ë¡œ ì„¤ì •í•œë‹¤.
-
- 성공하면 ë°˜í™˜ê°’ì€ 0ì´ê³ 실패하면 -1ì´ë‹¤. 다ìŒì˜ errno는 ì´ í•¨ìˆ˜ë¥¼ 위해 ì •ì˜ëœ ì—러ìƒí™©ì´ë‹¤.
** ì—ìžì£¼ : ì—시 ì´ê³³ì—ì„œë„ ë¬¸ë§¥ìƒ Readê°€ 맞지가 않습니다. ì±…ì—는 Readë¼ê³ 나와있지만, 함수
ì´ë¦„ì´ë‚˜, ë‹¤ìŒ ë¬¸ìž¥ë“¤ì„ ì°¸ê³ ë¡œ 보건대 ì €ëŠ” Setì´ ë§žë‹¤ê³ ìƒê°í•©ë‹ˆë‹¤.
ESRCH : class와 idì˜ ì¡°í•©ì´ í˜„ì¡´í•˜ëŠ” ì–´ë–¤ í”„ë¡œì„¸ìŠ¤ì™€ë„ ë§žì§€ê°€ 않는다.
EINVAL : classì˜ ê°’ì´ ìœ ìš©í•˜ì§€ 않다.
EPERM
- ë‹¹ì‹ ì´ ë‹¤ë¥¸ 사용ìžì˜ í”„ë¡œì„¸ìŠ¤ì˜ ìš°ì„ ê¶Œì„ ì„¤ì •í•˜ë ¤ 시ë„í•˜ì˜€ê³ , ë‹¹ì‹ ì€ ê·¸ê²ƒì„ ìœ„í•œ 특권ì„
가지지 않았다.
EACCES
- ë‹¹ì‹ ì´ ì–´ë–¤ í”„ë¡œì„¸ìŠ¤ì˜ ìš°ì„ ê¶Œì„ ë‚®ì¶”ë ¤ 시ë„í–ˆê³ , ë‹¹ì‹ ì€ ê·¸ê²ƒì„ í• ë§Œí•œ íŠ¹ê¶Œì´ ë¶€ì—¬ë˜ì§€
않았다.
- ì¸ìˆ˜ class와 id는 함께 ë‹¹ì‹ ì´ ìš°ì„ ê¶Œì„ ì½ê±°ë‚˜, ì„¤ì •í• í”„ë¡œì„¸ìŠ¤ì˜ ì§‘í•©ì„ ì„¤ì •í•œë‹¤. ì´ë“¤ì€
classì—서 ì‚¬ìš©í• ìˆ˜ 있는 값들ì´ë‹¤.
PRIO_PROCESS
- 한 í”„ë¡œì„¸ìŠ¤ì˜ ìš°ì„ ê¶Œì„ ì½ê±°ë‚˜ ì„¤ì •í•˜ë¼. ì¸ìˆ˜ id는 í”„ë¡œì„¸ìŠ¤ì˜ IDì´ë‹¤.
PRIO_PGRP
- 한 프로세스 ê·¸ë£¹ì˜ ìš°ì„ ê¶Œì„ ì½ê±°ë‚˜ ì„¤ì •í•˜ë¼. ì¸ìˆ˜ id는 프로세스 그룹 ID ì´ë‹¤.
PRIO_USER
- 한 사용ìžì˜ í”„ë¡œì„¸ìŠ¤ë“¤ì˜ ìš°ì„ ê¶Œì„ ì½ê±°ë‚˜ ì„¤ì •í•˜ë¼. ì¸ìˆ˜ id는 ì‚¬ìš©ìž IDì´ë‹¤.
- ë§Œì¼ ì¸ìˆ˜ idê°€ 0ì´ë©´, classì— ë”°ë¼ì„œ 현재 프로세스, 현재 프로세스 그룹 ë˜ëŠ” 현재 사용ìžë¥¼
나타낸다.
함수 : int nice(int increment)
- increment로 현재 í”„ë¡œì„¸ìŠ¤ì˜ ìš°ì„ ê¶Œì„ ì¦ê°€ì‹œí‚¨ë‹¤. ë°˜í™˜ê°’ì€ ì˜ë¯¸ê°€ 없다. 다ìŒì€ nice함수와 ê°™ì€
ì¼ì„ 하는 함수ì´ë‹¤. 즉. . niceì˜ ì •ì˜ì´ë‹¤.
- int nice (int increment)
- {
- int old = getpriority (PRIO_PROCESS, 0);
- setpriority (PRIO_PROCESS, 0, old + increment);
- }
목차 ì´ì „ : 16. 패턴 ë§¤ì¹ ë‹¤ìŒ : 18. í™•ìž¥ëœ ë¬¸ìžë“¤