함수 원형 : ssize_t write(int fd, const void *buf, size_t nbytes);
반환 값
➔ 성공 시 : 출력한 byte 수
➔ 실패 시 : -1
함수 인자
➔ fd : file descriptor*
open(2), creat(2), socket(2), accept(2) 등을 통하여 정상적으로 open한 file descriptor
➔ buf : 전송할 데이터를 가지고 있는 버퍼의 pointer
➔ nbytes : 전송할 데이터의 byte 수
2) malloc
함수 원형 : void *malloc(size_t _Size);
반환 값
➔ 성공 시 : 할당한 메모리의 첫번째 주소
➔ 실패 시 : NULL
함수 인자
➔ size : 할당할 메모리의 byte 수
동적 할당
➔ 의미 : 프로그램의 동작 중에 메모리를 할당하는 것
➔ 동적으로 메모리를 할당할 때는 Heap 영역*에 메모리 할당
➔ 동적으로 할당된 메모리는 반드시 free 해야한다. 그렇지 않으면, memory leaks 발생
3) free
함수 원형 : void free(void *ptr);
반환 값
➔ NULL
함수 인자
➔ malloc, calloc, realloc 등으로 할당된 메모리 주소
2-1. 관련 내용 정리
1) File descriptor
개념 : Linux 혹은 Unix 계열의 시스템에서 process가 file(디렉토리, 소켓, 파이프 등)을 다룰 때 사용하는 개념으로, 특정 파일에 접근할 때 사용되는 추상적인 값이다.
(일반적으로 0이 아닌 정수값을 갖는다.)
할당 방법
➔ 해당 process의 file descriptor number 중 사용되지 않은 가장 작은 값을 할당
➔ 기본적으로 할당되는 file descriptor는 standard input(0), standard output(1), standard error(2)
2) 메모리 구조
프로그램 실행 시, 운영체제는 메모리 공간을 할당해준다.
메모리 공간은 스택(Stack)*, 힙(Heap)*, 데이터(Data)*, 코드(Code)* 영역으로 구분된다.
할당 시기 : program이 실행될 때
할당 장소 : RAM
할당 용도 : program 작동 시 필요한 메모리 공간(지역변수, 전역변수 등)
3) Stack 영역
함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 메모리 영역
함수가 종료 시 해제
push를 통해 데이터를 저장하고, pop을 통해 데이터를 인출
LIFO방식에 따라 동작하며, 메모리의 높은 주소에서 낮은 주소의 방향으로 할당
stack overflow
➔ 함수의 재귀 호출이 무한히 반복되면, 재귀 호출에 의한 스택프레임이 계속해서 쌓임
➔ 스택의 모든 공간을 다 차지하고 난 후 더 이상의 여유 공간이 없을 때 다시 스택 프레임을 저장하게 될 시 발생
➔ 오동작 혹은 보안 취약점의 문제로 강제종료
4) Heap 영역
동적으로 메모리를 할당할 때 사용되는 메모리 영역
free 시 해제
힙 영역이 필요한 이유 : 사용자의 요구에 맞게 메모리를 할당(런타임 동안에 메모리의 크기 결정)해주기 위해서