ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Unix Programming : 명령어 만들기 : 1/3
    Computer Science/etc 2020. 6. 15. 16:17
    728x90

    설명

    1.       파일과 디렉토리에 관련된 시스템 콜과 라이브러리 함수를 이용하여 명령어들을 만든다. 

     

    2.      자신의 프로그램에 대한 아이디어, 구현 범위, 동작에 대한 설명을 포함한다. 


    순 서

    1.      mycat

        1)      동작에 대한 설명

        2)     소스 코드

        3)     동작 예시

     

     

    2.     mycp

        1)      동작에 대한 설명

        2)     소스 코드

        3)     동작 예시

     

     

    3.     myls

        1)      동작에 대한 설명

        2)     소스 코드

        3)     동작 예시


    1.      mycat [option] [file]

    1)      구현 아이디어 및 설명

    • option을 처리하는 함수인 getopt을 이용하였다. getopt함수의 구조는 다음과 같다.

    • argc, argv은 main함수에서 받은 것을 그대로 사용한다. optstring은 사용 가능한 옵션의 문자를 나타낸다. optarg는 욥션의 인자를 저장한다. optind는 다음에 처리할 argv의 주소를 나타낸다. optopt는 오류를 발생시킨 문자를 나타낸다. opterr는 옵션에 문제가 있을 경우 0이 아닌 값이 된다.
    • 옵션 b, n, T는 상대적으로 수월하게 수행하였지만, 옵션 E를 구현하기 위해서는 문자열의 마지막 부분에 접근할 수 있어야 했다. 이 과정을 원활히 수행하는데에 어려움을 느꼈다. 결국 해결한 방식은 기존의 문자열의 길이를 len이라고 했을 때, len+1만큼의 길이를 가지는 새로운 문자열을 만들고, 기존의 문자열을 복사한 후 문자열 마지막 부분에 $기호를 추가하였다. 
    • 옵션 s는 빈 행이 처음 등장할 때 tmp값을 증가시키고, tmp값이 1이지만 빈 행이 추가적으로 등장한다면, 빈 행을 더이상 출력하지 않는 방식으로 작성하였다. 

    2)     프로그램 소스 및 설명문

    #include <stdio.h>
    
    #include <stdlib.h>
    #include <errno.h>
    #include <fcntl.h>
    #include <string.h>
     
    int main(int argc, char *argv[]){
        
        extern char *optarg;
        extern int optind;
        
        FILE *fp;   // 파일포인터 사용을 위해
        int fd, n, i=1, tmp=0, len;
        char ch, buf[BUFSIZ];   // 출력할 문자열을 담기 위해
        while((n=getopt(argc, argv, "TbEns:"))!=-1)  // 옵션이 없다면 -1을 리턴한다
        {
            fp=fopen(argv[2], "r"); // 옵션의 다음 인자를 가져올 파일로 하고, 읽기모드로 연다
            switch(n){
                case 'T':
                    while(fgets(buf, sizeof(buf), fp)!=NULL){
                        if(strcmp(buf," ")) // buf 문자열과 tap 문자열이 일치한 경우
                            printf("^I");  // ^I를 출력한다
                        else
                            printf("%s", buf);
                    }
                    break;
                case 'n':
                    while(fgets(buf, sizeof(buf), fp)!=NULL)
                    // fgets함수를 이용하여 파일의 내용을 문자열 단위로 가져온다
                    // null을 리턴한다는 것은 문자열의 종료를 의미한다
                    {
                        printf("    %d  %s", i, buf);   // i는 줄 번호를 의미한다
                        i++;    // 줄 번호를 증가시킨다
                    }
                    break;
                case 'b':
                    while(fgets(buf, sizeof(buf), fp)!=NULL){
                        if(!strcmp(buf, "\n"))  // 빈 행을 걸러내기 위해 strcmp함수를 이용하였다
                        {
                            printf("\n");   // 줄 번호 없이 빈 행을 출력한다 
                            continue;   // 줄번호를 출력하지 않기 위함이다 
                        }
                        printf("    %d  %s", i, buf);   // if문에 해당하지 않는다면 옵션 n과 같은 방식으로 출력한다
                        i++;
                    }
                    break;
                case 'E':
                    while(fgets(buf, sizeof(buf), fp)!=NULL){
                        len=strlen(buf);    //  buf 문자열의 길이를 len으로 한다
                        char*tmp=(char*)malloc(sizeof(char)*(len+1));   // buf 문자열보다 1만큼 더 길 tmp 문자열의 메모리를 할당받는다 
                        tmp=buf;    // buf 문자열을 tmp 문자열에 저장한다
                        len=strlen(buf);    // buf 문자열의 길이를 len으로 한다
                        tmp[len-1]='$'; // 결과적으로 tmp 문자열의 마지막(null 문자 앞)에 $ 기호가 추가된다
                        printf("%s\n", tmp);    // tmp 문자열을 출력한다 
                    }
                    break;
                case 's':   // 옵션이 s일 경우
                    while(fgets(buf, sizeof(buf), fp)!=NULL){
                        if(!strcmp(buf, "\n")){
                            tmp++;  // 빈 행의 갯수를 세기 위해 tmp를 사용하였다
                            if(tmp==1)  
                            // 빈 행의 갯수가 1일 경우에만 빈 행을 출력한다
                            // tmp 값이 1보다 크다면, 빈 행의 연속됨을 의미함으로 continue한다
                                printf("\n");
                            continue;
                        }
                        printf("%s", buf);
                    }
                    break;
            }
        }
        
        if(n==-1 && optind==1)  // 옵션이 없고, 옵션의 인덱스의 변화 역시 없다면 다음을 실행한다
        {
            fp=fopen(argv[1], "r"); // 옵션이 없으므로 argv[1]에 해당하는 인자가 가져올 파일이다
            while(fgets(buf, sizeof(buf), fp)!=NULL)
                printf("%s", buf);  // buf 문자열을 출력한다 
        }
            
        return 0;
        
    }

    3)     기본 기능


    4)    옵션 기능

     

    (1)    -b : 줄 번호를 화면 왼쪽에 나타낸다. 비어있는 행은 제외한다.

     

    (2)   -n : 줄 번호를 화면 왼쪽에 나타낸다. 비어있는 행도 포함한다.

     

    (3)   -E : 각 행의 끝에 $를 추가한다.

     

    (4)   -s : 연속되는 2개이상의 빈 행은 하나의 빈 행으로 출력한다.

     

    (5)   -T : 탭 문자를 출력한다.

     

     

     

     

    728x90

    댓글

kxmjhwn@gmail.com