2011. 10. 23. 16:29

#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 ]

/data/workspace/linux-src/example/file/zap.c.html
 
/* 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

최종 수정 시간과 최종 접근 시간이 변경되지 않았다.

그러나 상태 변경 시간은 프로그램을 실행한 시간으로 바뀌었다.

Posted by devanix