[UNIX 시스템 프로그래밍 second Edition - KEITH HAVILAND저] 연습문제 풀이입니다.
(저작권에 저촉 될 우려가 있어 문제 내용은 생략합니다.)
연습문제 3.10 입니다.
선택한 파일이 변경되는지 여부를 파악하여, 변경 될 때 표준출력으로 파일의 내용을 출력하는 프로그램입니다.
먼저 파일의 변경 여부를 확인하기 위해 파일의 최종 변경 시간을 가져옵니다.
이후 파일의 최종 변경 시간이 갱신되었다면 이때 표준 출력으로 파일의 내용을 출력하게 됩니다.
코드를 보면 더 쉽게 이해할 수 있을것이라 생각합니다.
코드는 C++로 작성하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #define BUFF_SIZE 1000 void slowwatch(const char*, time_t); struct stat sb; int main(int argc, char* argv[]) { int j; int fd; time_t last_time; if(argc < 2) { fprintf(stderr, "usage : lookout filename ...\n"); exit(1); } if(--argc > 1) { fprintf(stderr, "lookout : too many filenames\n"); exit(1); } fd = open(argv[1], O_RDWR | O_CREAT, 0644); fd = close(fd); if(stat(argv[1], &sb) == -1) { fprintf(stderr, "lookout: couldn't stat %s\n", argv[j]); perror("stat"); exit(1); } last_time = sb.st_mtime; for(;;) { slowwatch(argv[1], last_time); sleep(3); } } void slowwatch(const char *name, time_t last) { if(stat(name, &sb) == -1 || sb.st_mtime != last) { printf("%s changed\n", name); char buff[BUFF_SIZE]; int fd; ssize_t rd_size; if( 0 < (fd = open(name, O_RDONLY))) { while( 0 < ( rd_size = read( fd, buff, BUFF_SIZE-1))) { buff[rd_size] = '\0'; puts(buff); } close(fd); } else printf("file open fail\n"); exit(1); } } |
'학교 수업 및 과제 > 유닉스 프로그래밍' 카테고리의 다른 글
[UNIX 시스템 프로그래밍] 연습문제 3.8 풀이 (0) | 2018.05.30 |
---|---|
[UNIX 시스템 프로그래밍] 연습문제 3.7 풀이 (0) | 2018.05.30 |
[UNIX 시스템 프로그래밍] 연습문제 3.6 풀이 (0) | 2018.05.30 |
[UNIX 시스템 프로그래밍] 연습문제 3.3 풀이 (0) | 2018.05.30 |
[UNIX 시스템 프로그래밍] 연습문제 2.15 풀이 (0) | 2018.05.30 |