#include <sys/types.h> #include <utime.h> int utime(const char *filename, const struct utimbuf *times);
반환값: 성공 0, 실패 -1(errno 설정) |
@filename: 변경할 파일 이름
@times :
- NULL이면 접근 시간과 수정 시간 모두 현재 시간으로 설정.
(유효 사용자 ID가 파일의 소유자 ID와 같거나, 프로세스가 파일에 대해 쓰기 권한 필요)
- NULL이 아니면 접근 시간과 수정 시간이 times가 가리키는 구조체에 있는 값들로 설정.
(유효 사용자 ID가 파일의 소유자 ID와 같거나, 프로세스가 슈퍼 사용자 프로세스여야 함)
utimbuf 구조체: |
|
struct utimbuf { time_t actime; time_t modtime; } |
/* access time */ /* modification time */ |
※ 구조체에 상태 변경 시간(st_ctime, i노드가 마지막으로 변경된 시간)에 대한 필드가 없는 것은
utime 함수가 호출되면 어차피 자동으로 갱신되기 때문이다.
[ Example ] |
/* zap.c * * O_TRUNC를 지정한 open을 이용해서 주어진 파일들의 * 크기를 0으로 줄이되, 파일들의 접근 시간이나 수정 * 시간은 변경하지 않는다. 이를 위해 프로그램은 우선 * stat 함수로 시간들을 얻고, 파일을 크기 0으로 자르고, * utime 함수로 시간들을 복원한다. */ #include <stdio.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <utime.h> #include <sys/stat.h> #include <sys/types.h> #include <errno.h> int main(int argc, char *argv[]) { int i, fd; struct stat statbuf; struct utimbuf timebuf; if (argc < 2) { fprintf(stderr, "Usage: %s <files>...\n", argv[0]); return 0; } for (i=1; i<argc; i++) { /* 현재 시간을 얻는다 */ if (stat(argv[i], &statbuf) < 0) { fprintf(stderr, "%s: state error: %s\n", argv[i], strerror(errno)); continue; } /* 크기를 0으로 자른다 */ if ((fd = open(argv[i], O_RDWR | O_TRUNC)) < 0) { fprintf(stderr, "%s: open error: %s\n", argv[i], strerror(errno)); continue; } close(fd); /* 시간들을 복원한다 */ timebuf.actime = statbuf.st_atime; timebuf.modtime = statbuf.st_mtime; if (utime(argv[1], &timebuf) < 0) { fprintf(stderr, "%s: utime error: %s\n", argv[i], strerror(errno)); continue; } } return 0; } |
[실행 예] |
$ ls -l changemod times 크기와 최종 수정 시간 확인 -rwxrwxr-x 1 sar 15019
Nov 18 18:53 changemod -rwxrwxr-x 1 sar 16172
Nov 19 20:05 times $ ls -lu changemod times 최종 접근 시간 확인 -rwxrwxr-x 1 sar 15019
Nov 18 18:53 changemod -rwxrwxr-x 1 sar 16172
Nov 19 20:05 times $ date print today's
date Thu Jan 22
06:55:17 EST 2004 $ ./zap changemod times 예제 실행 $ ls -l changemod times and check the results -rwxrwxr-x 1 sar 0 Nov
18 18:53 changemod -rwxrwxr-x 1 sar 0 Nov
19 20:05 times $ ls -lu changemod times 최종 접근 시간 확인 -rwxrwxr-x 1 sar 0 Nov
18 18:53 changemod -rwxrwxr-x 1 sar 0 Nov
19 20:05 times $ ls -lc changemod times 상태 변경 시간을 확인 -rwxrwxr-x 1 sar 0 Jan
22 06:55 changemod -rwxrwxr-x
1 sar 0 Jan 22 06:55 times |
※ 최종 수정 시간과 최종 접근 시간이 변경되지 않았다.
그러나 상태 변경 시간은 프로그램을 실행한 시간으로 바뀌었다.
'Linux > Programming' 카테고리의 다른 글
프로세스의 종료 - exit, _exit, atexit (0) | 2011.11.03 |
---|---|
한계들(Limits) – limits.h 와 conf 함수들 (0) | 2011.10.23 |
파일 시간들(File Times) - 수정, 변경, 접근 시간 (0) | 2011.10.23 |
파일 접근 권한 비트 요약 (0) | 2011.10.23 |
파일 상태 정보 얻기 - stat, fstat, and lstat Functions (0) | 2011.10.23 |