[Libft] C 언어 라이브러리 구현_Part2_추가함수 구현3
혹시나 문제가 된다면 바로 비공개 처리하겠습니다. 지적이나 댓글 환영합니다!
이번 포스팅에서는 이어서 part2의 함수를 구현해 보겠다. file descripter를 매개변수로 받아 write()를 사용하는 함수 4가지를 구현하였다.
주의사항이라고 적은 사항들이 대부분 내가 실수했으나 고쳐서 어떻게 해결했는 지에 대한 내용들이다.
참고로, 내가 정의한 libft.h 헤더에는 <unistd.h>와 <stdlib.h>가 include 되어있다. 따라서 libft.h를 호출하면, 따로 정의하지 않고도 <unistd.h> 에 정의된 size_t 타입과 <stdlib.h>의 malloc/free를 사용할 수 있다. 또한 <unistd.h>에 있는 write 함수 또한 사용할 수 있다.
* fd (File descripter)란 무엇인가?
1) 시스템으로부터 할당 받은 파일을 대표하는 0이 아닌 정수 값
2) 프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값
3) 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스
- 유닉스 시스템에서 모든 것은 "파일"이다. 모든 객체들은 파일로써 관리된다.
- 유닉스 시스템에서 프로세스가 이 파일들을 접근할 때에 파일 디스크립터라는 개념을 이용한다.
- 파일 디스크립터는 '0이 아닌 정수' 값이다. 즉, 음수가 아닌 0과 양수인 정수 값을 갖는다.
프로세스가 실행 중에 파일을 Open 하면 커널은 해당 프로세스의 파일 디스크립터 숫자 중에 사용하지 않는 가장 작은 값을 할당해 준다.
그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근할 때, FD 값을 이용해 값을 지칭할 수 있다.
프로그램이 프로세스로 메모리에서 실행을 시작할 때, 기본적으로 할당되는 파일 디스크립터들이 있다. 바로 표준 입력, 표준 출력, 표준 에러이다. 이들에게 각각 0, 1, 2 라는 정수가 할당된다.
0이 아닌 정수로 표현된느 파일 디스크립터는 0 ~ OPEN_MAX까지의 값을 가질 수 있으며, OPEN_MAX 값은 플랫폼에 따라 다르다.
파일 디스크립터는 위에서 볼 수 있듯이, 단순히 숫자인 이유는 프로세스가 유지하고 있는 FD 테이블의 인덱스이기 때문이다. FD 3번이라는 의미는 FD 테이블의 3번 항목이 가리키는 파일이라는 의미이다.
프로세스는 이런 FD 테이블과 파일 테이블의 정보를 직접 고칠 수 없으며, 반드시 커널을 통해서 수정해야 한다.
(1) ft_putchar_fd
: 주어진 fd에 대하여 주어진 문자를 write한다.
- 구현 코드 예시 :
1
2
3
4
5
6
|
#include "libft.h"
void ft_putchar_fd(char c, int fd)
{
write(fd, &c, 1);
}
|
cs |
(2) ft_putstr_fd
: 주어진 fd에 대하여 주어진 문자열을 write한다.
- 구현 코드 예시 :
1
2
3
4
5
6
7
|
#include "libft.h"
void ft_putstr_fd(char *s, int fd)
{
write(fd, s, ft_strlen(s));
}
|
cs |
- ft_strlen()을 통해 문자열의 길이를 구해서, s의 시작주소로부터 그만큼의 바이트를 주어진 fd로 write한다.
(3) ft_putendl_fd
: 주어진 fd에 대하여 주어진 문자열을 개행문자와 함께 write한다.
- 구현 코드 예시 :
1
2
3
4
5
6
7
|
#include "libft.h"
void ft_putendl_fd(char *s, int fd)
{
ft_putstr_fd(s, fd);
write(fd, "\n", 1);
}
|
cs |
- 주의사항 : 따로 개행을 write할 때, write(fd, "\n", 1)이 아니라 write(1, "\n", 1)라고, 습관적으로 fd 대신 1을 쓰는 실수를 할 수 있음
특히 이런 실수의 경우는 잘 눈에 띄지 않아 찾아내기가 어렵다
- 앞서 구현한 ft_putstr_fd()를 활용하여 문자열을 write한 다음, write함수를 통해 주어진 fd로 개행문자를 write해준다.
(4) ft_putnbr_fd
: 주어진 fd에 대하여 주어진 숫자를 write한다.
- 구현 코드 예시 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#include "libft.h"
static void write_nbr_fd(int n, int fd)
{
char c;
c = (n % 10) + '0';
if (n >= 10)
write_nbr_fd(n / 10, fd);
write(fd, &c, 1);
}
void ft_putnbr_fd(int n, int fd)
{
if (n == -2147483648)
{
write(fd, "-2147483648", 11);
return ;
}
else if (n < 0)
{
write(fd, "-", 1);
n *= -1;
}
write_nbr_fd(n, fd);
}
|
cs |
- 주의사항 : 습관적으로 write()의 fd 인자 위치에 1을 써버리는 실수를 할 수 있다. 특히 "-"를 write() 해주는 부분을 주의해야한다
- 숫자 n을 양수로 만들어, 재귀를 통해 한 글자씩 write해주는 방식으로 구현하였다.
- 이때 int 최솟값인 -2^31에 -1을 곱해 양수로 만들면 int 범위 (최대값 = 2^31 - 1)를 벗어나므로, 이는 따로 앞부분에서 예외처리 해주었다.
- 음수에 (-1)을 곱해 양수로 만들 때, "-" 부호를 주어진 fd로 write() 해주었다.
참고 자료 출처 :
'IT > 42Seoul' 카테고리의 다른 글
Makefile 정리1 (0) | 2021.05.25 |
---|---|
TIP : 코드 리뷰 잘 하는 법 (0) | 2021.05.24 |
[Libft] C 언어 라이브러리 구현_Part2_추가함수 구현2 (0) | 2021.05.23 |
[Libft] C 언어 라이브러리 구현_Part2_추가함수 구현1 (0) | 2021.05.23 |
42서울 : 라피신 후기 + 본과정 합격 후기 (4기 2차 : 3 /22 ~ 4/16) (0) | 2021.05.20 |