이 프로젝트는 세그먼트(segment)를 통해 다양한 지점(x, y, z)을 연결하여 풍경의 단순화된 "골격"(wireframe) -프랑스어로 'fils de fer', 즉 프로젝트 이름 FdF - 그래픽을 만드는 것이다.
세그먼트(segment)
프로그램에 정의된 특정 영역으로, 코드, 데이터 등이 이에 해당된다.
세그먼트는 메모리의 거의 어느 곳에나 위치할 수 있고, 프로그램 실행을 위해 필요한 공간과 데이터를 처리하는 명령어들을 위한 프로그램이나 메모리의 부분이다.
주요 세그먼트
- 실행될 프로그램의 기계어 명령어를 포함하는 코드(code) 세그먼트
- 프로그램에서 정의된 데이터, 상수, 작업 영역 등을 포함하는 데이터(data) 세그먼트
- 프로그램이 임시로 사용하는 지역 함수 변수 등의 데이터가 저장되는 스택(stack) 세그먼트
- 크기가 고정되어 있지 않고 프로그래머가 직접 접근 가능한 힙(heap) 세그먼트
장점
- 세그먼트 단위로 메모리를 통제할 수 있다.
단점
- 메모리 영역이 동적으로 분할되기 때문에 할당될 프로그램 크기보다 세그먼트 영역이 작아 할당이 불가능한 외부 단편화(external fragmentation) 문제가 발생할 수 있다.
이 풍경의 좌표는 프로그램에서 매개 편수로 전달된 파일에 저장된다.
아래는 풍경의 좌표 예이다.
각 숫자는 공간의 한 점, 즉 좌표에 해당한다.
fdf
프로그램을 실행하면 다음과 같이 실행되어야 한다.
$> ./fdf 42.fdf
libft
를 사용하는 것을 기억해라.
get_next_line
, ft_split
, ft_getnbr
을 사용하면 파일에서 데이터를 빠르고 간단하게 읽을 수 있다.
이 과제의 목표는 지도를 분석하는 것이 아니다.
즉, 파일에 포함된 지도가 올바른 형식으로 존재한다는 것을 의미한다.
그래픽 표현에 관해:
fdf
는 등각 투영법을 사용해 지도를 표시해야 한다.esc
를 눌러 프로그램을 종료할 수 있어야 한다.minilibX
의 이미지를 사용해 프로젝트를 검증할 필요는 없지만, 사용하는 것을 강력히 권장한다.등각 투영법(isometrci projection)
육면체를 투영한 때, 3축의 선분이 각각 120도로 이루어져 윤곽이 정육각형이 되는 투영을 등각투영이라 한다.
이 경우, 좌표축상의 길이는 실제 길이보다 짧게 되지만, 이것을 실제 길이로 묘사한 것을 등각도라 한다.
fdf
이어야 한다.Makefile
을 제출해야 한다.miniLibX
를 사용해야 한다.#include <fcntl.h>
int open(const char *path, int oflag, ...);
open()
파일을 사용하기 위해 여는(open) 함수
반환값
파일을 open
할 때 용도에 따라 oflag
에 옵션을 지정하여 연다.
아래의 옵션은 모두 fcntl.h
에 정의되어 있다.
열기 옵션 | 설명 |
---|---|
O_RDONLY | 읽기 전용으로 열기 |
O_WRONLY | 쓰기 전용으로 열기 |
O_RDWR | 읽기와 쓰기 모두 가능 |
추가적인 옵션도 존재한다.
기타 옵션 | 설명 |
---|---|
O_CREAT | 해당 파일이 없으면 생성한다. (주의) O_CREATE 가 아니라 끝에 E가 없는 O_CREAT 다. O_CREAT로 파일을 생성하게 된다면 파일의 접근권한을 지정하기 위해 접근 권한 값을 추가해야 한다. ex: open( "badayak.txt", O_WRONLY \| OCREAT, 0644); |
O_EXCL | O_CREAT를 사용했을 때, 파일이 이미 있어도 열기가 가능하여 쓰기를 하면 이전 내용이 사라진다. O_CREAT를 사용할 때, O_EXCL를 함께 사용하면, 이미 파일이 있을 때에는 open() 되지 않아 이전 파일을 보존할 수 있다. ex: fd = open( "./test.txt", O_WRONLY \| O_CREAT \| O_EXCL, 0644) 즉, 이렇게 O_EXCL을 함께 사용하면, 파일이 없을 경우에는 O_CREAT 영향을 받아 쓰기 전용의 파일이 생성하고, 파일이 이미 존재하면 open() 이 실패된다. |
O_TRUNC | 기존의 파일 내용을 모두 삭제한다. |
O_APPEND | 파일을 추가하여 쓰기가 되도록 open 후에 쓰기 포인터가 파일의 끝에 위치하게 된다. |
O_NOCITTY | 열기 대상이 터미널일 경우, 이 터미널이 플로그램의 제어 터미널로 할당하지 않는다. |
O_NONBLOCK | 읽을 내용이 없을 때에는 읽을 내용이 있을 때까지 기다리지 않고 바로 복귀한다. |
O_SYNC | 쓰기를 할 때, 실제 쓰기가 완료될 때 까지 기다린다. 즉, 물리적으로 쓰기가 완료되어야 복귀하게 된다. |
이 외에도 더 다양한 옵션들이 존재한다.
#include <unistd.h>
ssize_t read(int fildes, const void *buf, size_t, nbyte);
ssize_t write(int fildes, const void *buf, size_t nbyte);
int close(int fildes);
read()
파일에 데이터를 읽는 함수
반환값
write()
파일에 데이터를 출력하는 함수
반환값
close()
열린 파일을 닫는 함수
close()를 호출하면 fd 를 해제하며, 파일에서 프로세스를 분리한다.
프로세스가 종료되면 커널이 프로세스의 열린 파일들을 모두 자동으로 닫기 때문에 명시적으로 close() 함수를 호출하지 않는 프로그램들도 많다.
반환값
#include <stdlib.h>
void * malloc(size_t size);
void free(void *ptr);
malloc()
반환값
free()
반환값
#include <stdio.h>
void perror(const char *s);
오류 메세지를 출력하는 함수
반환값
전역 변수 errno
의 값을 해석하여 이에 해당하는 시스템 오류 메세지를 표준 오류 출력 스트림(stderr)에 출력한다. 또한 추가적으로 전달하고자 하는 사용자 정의 메세지를 s
인자에 담아 출력할 수도 있다.
만약 s
가 NULL 포인터가 아니라면 사용자 정의 메세지가 시스템 오류 메세지 이전에 출력된다. 이 때 두 개의 메세지는 ": " 로 구분된다. 그리고 s
에 상관 없이 맨 마지막에는 개행 문자('\n')가 출력된다.
perror
은 오류가 발생한 바로 다음에 호출되어야 한다. 그렇지 않을 경우 다른 함수들의 호출에 의해 출력 결과가 달라질 수 있다.
errno
정수형 변수로 이전의 라이브러리 함수에 의해 발생한 오류에 대한 정보를 가지고 있다. 이 때,errno
에 값에 따라perror
함수에 의해 출력되는 시스템 오류 메세지는 플랫폼이나 컴파일러에 따라 달라질 수 있다.
#include <string.h>
char *strerror(int errnum);
오류 메세지 문자열을 가리키는 포인터를 얻어오는 함수
반환값
errnum
의 값을 통해 발생하였던 오류에 알맞은 오류 메세지를 가리키는 포인터를 리턴한다.
이 때 리턴되는 포인터는 문자열 리터럴을 가리키고 있기 때문에 그 내용이 바뀔 수 없다.
strerror
에 의해 출력되는 오류 메세지는 현재 사용중인 컴파일러나 플랫폼에 따라 다를 수 있다.
#include <stdlib.h>
void exit(int status);
status
는 운영체제에 전달하며 main함수의 return값과 같은 역할이다.status
값은 에러 코드와 같으므로 정상 종료시 0을, 에러로 인한 종료시 0이 아닌 숫자, 대체로 1을 반환한다.메뉴얼 참조
$> man 3 math
참고 자료
https://www.scienceall.com/%EC%84%B8%EA%B7%B8%EB%A8%BC%ED%8A%B8segment/
https://terms.naver.com/entry.naver?docId=411777&cid=42327&categoryId=42327