[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;
        if0 < (fd = open(name, O_RDONLY))) {        
            while0 < ( 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 시스템 프로그래밍 second Edition - KEITH HAVILAND저] 연습문제 풀이입니다.


(저작권에 저촉 될 우려가 있어 문제 내용은 생략합니다.)


연습문제 3.8 입니다.

이번 문제의 경우 사용자가 unlink를 사용하며 파일을 제거하는 프로그램을 작성하는 것이 목표입니다.

먼저 사용자가 파에 쓰기 권한을 가졌는지 확인하기 위해 access 함수를 이용하였습니다.

이후 쓰기 권한을 가졌다면 unlink 함수를 이용하여 파일을 삭제하였습니다.


코드는 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
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
 
int main(int argc, char *argv[]) {
    int check = 0;    
    if (argc !=2) {
        fprintf(stderr, "delete only one file\n");
        exit(1);    
    }
    if(access (argv[1], W_OK) == -1) {
        perror("cannot write");
        printf("\tyou don't have write permission.\n\tDo you want really delete file?\n\tif you want, input 1 : ");
        scanf("%d",&check);
        if(check == 1)
            printf("OK. delete file\n");
        else {
            printf("file delete cancel\n");
            exit(0);    
        }
    }
    if(unlink(argv[1]) == -1) {
        perror("unlink failed");
        exit(1);    
    }
    
    printf("Succeeded\n");
    exit(0);
}
 



[UNIX 시스템 프로그래밍 second Edition - KEITH HAVILAND저] 연습문제 풀이입니다.


(저작권에 저촉 될 우려가 있어 문제 내용은 생략합니다.)


연습문제 3.7 입니다.

특정 파일의 권한을 바꾸기 위해 ls스타일로 권한 명령을 내리면 변환해 주는 프로그램입니다.

ls스타일을 이용하기 위해 연습문제 3.3 에서 작성한 코드를 이용하였습니다.

변환 과정은 연습문제 3.3과 거의 같으며 실제 권한 변경을 수행하기 위해 chmod 함수를 이용했습니다.


코드는 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
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
 
char oc[4= "";
 
int lsoct(char* ls) {
    int check = 0;
    for(int i=0; i<=8; i++) {
        switch(ls[i]) {
            case 'r':
                check += 4;
                break;
            case 'w':
                check += 2;                
                break;
            case 'x':
                check += 1;                
                break;
            case '-':
                break;
            default:
                printf("signal error\n");
                return -1;            
        }
        
        if(i%3 == 2) {
            char c[1= {check+48};
            strcat(oc,c);
            check = 0;
        }
    }
    return 0;
}
 
int main(int argc, char* argv[]) {
    if(argc != 3) {
        printf("error : not two factor\n");
        return -1;
    }
    else if(strlen(argv[2]) == 9)
        lsoct(argv[2]);
    else if(strlen(argv[2]) != 4) {
        printf("error : file permission\n");
        return -1;     
    }
    else
        strcpy(oc, argv[2]);
    
    long i = strtol(oc, 08);
    if(chmod(argv[1], i) == -1)
        perror("call to chmod falled\n");
 
    return 0;
    
 
}


[UNIX 시스템 프로그래밍 second Edition - KEITH HAVILAND저] 연습문제 풀이입니다.


(저작권에 저촉 될 우려가 있어 문제 내용은 생략합니다.)


연습문제 3.6 입니다.

주어진 화일에 대해 읽기, 쓰기 또는 수행접근 여부를 확인하기 위해 access 함수를 이용했습니다.

코드를 보면 쉽게 이해할 것이라 생각합니다.


코드는 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
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
void whatable(char* filename) {
    if(access (filename, R_OK) == -1)
        perror("cannot read ");
    else
        printf("%s readable, proceeding\n", filename);
    
    if(access (filename, W_OK) == -1)
        perror("cannot write ");
    else
        printf("%s writeable, proceeding\n", filename);
 
    if(access (filename, X_OK) == -1)
        perror("cannot execute ");
    else
        printf("%s executable, proceeding\n", filename);
}
 
int main(int argc, char* argv[]) {
    if(argc == 2)
        whatable(argv[1]);
    else {
        printf("error : no filename or many filename\n");
        return -1;    
    }
    return 0;
}
 
cs


[UNIX 시스템 프로그래밍 second Edition - KEITH HAVILAND저] 연습문제 풀이입니다.


(저작권에 저촉 될 우려가 있어 문제 내용은 생략합니다.)


연습문제 3.3 입니다.

문자열로 입력받은 권한을 팔진수 값으로 바꾸기 위해 lsoct 함수를 정의했습니다.

반대로 팔진수 값으로 입력받은 권한을 문자열로 변환하기 위해 octls 함수를 정의했습니다.

변환하는 과정은 코드를 참고하면 쉽게 이해할 수 있을 것이라 생각합니다.


코드는 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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <stdio.h>
#include <string.h>
 
int lsoct(char* ls) {
    int oc[4= {0};    
    int check = 0;
    for(int i=0; i<=8; i++) {
        switch(ls[i]) {
            case 'r':
                check += 4;
                break;
            case 'w':
                check += 2;                
                break;
            case 'x':
                check += 1;                
                break;
            case '-':
                break;
            default:
                printf("signal error\n");
                return -1;            
        }
        
        if(i%3 == 2) {
            oc[i/3+1]=check;
            check = 0;
        }
    }
    printf("convert complete : %d%d%d%d\n", oc[0], oc[1], oc[2], oc[3]);
    return 0;
}
 
int octls(char* oc) {
    char ls[9= "";
    if(oc[0== '0') {
        for(int i=1; i<=3; i++) {
        switch(oc[i]) {
            case '0':
                strcat(ls,"---");
                break;
            case '1':
                strcat(ls,"--x");
                break;
            case '2':
                strcat(ls,"-w-");
                break;
            case '3':
                strcat(ls,"-wx");
                break;
            case '4':
                strcat(ls,"r--");
                break;
            case '5':
                strcat(ls,"r-x");
                break;
            case '6':
                strcat(ls,"rw-");
                break;
            case '7':
                strcat(ls,"rwx");
                break;
            default:
                printf("number error\n");
                return -1;            
        }
        }
    }
    else {
        printf("this number is not octal number\n");
        return -1;    
    }
    printf("convert complete : %s\n",ls);
    return 0;
}
 
int main(int argc, char* argv[]) {
    if(!strcmp(argv[1],"lsoct"))
        lsoct(argv[2]);
    else if(!strcmp(argv[1],"octls"))
        octls(argv[2]);
    else {
        printf("Don't find you want\n");
        return -1;    
    }
    return 0;
}
 
cs