ABOUT ME

Today
Yesterday
Total
  • fd
    #02. 기존공부/#02.1 시스템 2019. 3. 4. 20:10

    1. fd 문제읽어보기

    Mommy! what is a file descriptor in Linux?

    엄마! 리눅스에서 파일 디스크립터가 뭐에요??

    * try to play the wargame your self but if you are ABSOLUTE beginner, follow this tutorial link:

    * 워게임을 혼자 풀어봐라 그러나 너가 완전 초보자라면 아래 튜토리얼 링크를 따라가보라:

    https://youtu.be/971eZhMHQQw



    2. 파일 디스크립터란?

    프로세스로 메모리에 적재되어 실행될 때 기본적으로 표준입력, 표준출력, 표준에러라는 파일 디스크립터(fd)를 할당해준다. 각각 0, 1, 2라는 정수가 할당되며 (1)POSIX 표준에서는 STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO로 참조된다.

    (1) POSIX: 이식 가능한 운영체제 인터페이스의 약자이다. 서로 다른 UNIX OS의 공통 API를 정리하여 이식성이 높은 UNIX 응용프로그램을 개발하기 위한 목적으로 IEEE(전기 전자 기술자 협회)가 책정한 어플리케이션 인터페이스 규격이다.

    :: UNIX OS간 원활한 이식을 위해 전기전자 기술자 협회(IEEE)가 정한 API 규격!


    3. 문제 풀어보기

    표준 입출력으로 어떻게 저떻게 하면 될 것 같다.



    내가 사랑하는 명령어 ls -l을 통해서 홈 디렉터리를 보니 세가지 파일이 있다.

    fd.c 파일을 읽어보면 위와 같은 소스코드를 확인할 수 있다.

    첫번째 if문을 살펴보면 인자의 개수가 2개보다 작을 때 "pass argv[1] a number\n"를 출력하고 종료된다.

    용어정리

    argc: 인자의 수가 저장되는 int형 변수

    argv: 인자의 내용이 저장되는 포인터형 배열(이 개수가 argc가 된다)

    envp: 인자 값 중 환경변수 값이 들어가는 포인터형 배열

    ./fd 1로 argv[1]에 1을 넣으니 "lean about Linux file IO\n" 가 출력된다.


     코드 흐름정리

    (1) int fd = atoi( argv[1] ) - 0x1234

    fd라는 int형 변수에 argv[1]의 값 (여기서는 1)을 int형으로 바꾼 후 0x1234만큼을 빼서 저장한다.

    (2) int len=0;

    len이라는 int형 변수에 0을 넣어 초기화시킨다.

    (3) len = read(fd, buf, 32);

    데이터를 전송해주는 대상을 가르키는 파일 디스크립터 fd를 통해 buf위치에 32바이트만큼 넣는다.

    (4) if(!strcmp("LETMEWIN\n", buf))

    LETMEWIN과 buf의 내용이 같아야 0을 출력하고 !0이므로 참이되어 if문 내부에 진입할 수 있다.


     결론

    read 함수의 첫번째 인자가 파일 디스크립터이다. 0으로 만들어주면 표준 입력으로 바뀌게 되고 LETMEWIN을 입력하면 풀이가 가능할 듯 하다.

    atoi 함수의 경우 10진법으로 입력된 문자열을 정수로 변환시켜준다.

    그냥 0x1234의 값인 4660을 입력하면 INT 형식으로 자동변환된다는 것이다.

    (a 같은 값을 입력하면 0으로 치부된다.)

    ./fd 4660을 입력하면 Clear

    댓글

Designed by Tistory.