-
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