728x90
minishell 을 만드는 도중 pipe 함수를 연속적으로 호출했을때 어떤 filedescriptor 값이 호출되는지 궁금하여 테스트 해보았다.
입력은 위와 같이 주었다.
PIPE 계속 호출
void next_pipe_check(t_ast *node, t_mcb *mcb)
{
int a;
// 다음에 또 파이프가 있는가?
if (node->right->type == AST_PIPE)
{
a = pipe(mcb->fd); // 3, 4
a = pipe(mcb->fd); // 5, 6
a = pipe(mcb->fd); // 7, 8
a = pipe(mcb->fd); // 9, 10
a = pipe(mcb->fd); // 11, 12
}
}
코드 일부분이다. 계속해서 int fd[2] 배열을 인자값으로 pipe 함수에 넘겨 주었다.
표준 입출력과 에러로 사용되는 0, 1, 2 을 제외하고, 3,4 / 5,6 / 7,8 ... 계속 늘어나는 것을 확인할 수 있다.
PIPE 호출후 close
void next_pipe_check(t_ast *node, t_mcb *mcb)
{
int a;
// 다음에 또 파이프가 있는가?
if (node->right->type == AST_PIPE)
{
a = pipe(mcb->fd); // 3, 4
a = close(mcb->fd[0]);
a = close(mcb->fd[1]);
a = pipe(mcb->fd); // 3, 4
a = close(mcb->fd[0]);
a = close(mcb->fd[1]);
a = pipe(mcb->fd); // 3, 4
a = pipe(mcb->fd); // 5, 6
}
}
여러번 pipe 호출하였으나, 이번에는 close 해주었다.
close 가 적절히 되었으면 다음 pipe 호출시 fd 3, 4를 갖게 되지만, 그렇지 않으면 이전과 같이 5,6 / 7, 8 로 점점 증가하게 된다.
결론
만약 pipe 함수를 통해 fd 호출 후 close 하지않는 shell을 만든다면, 언젠가 운영체제에서 호출가능한 fd를 초과하게 된다.
fd를 사용했으면 적절하게 close 하자
728x90
'교육 > 42서울' 카테고리의 다른 글
미니쉘(minishell) 과제 - 트리 구조로 파싱하기 (2) | 2021.10.01 |
---|---|
42 inception 과제 기초 가이드 - 도커 컴포즈로 실제 서비스를 올려보자 (2) | 2021.06.23 |
PUSH_SWAP 과제 (0) | 2021.05.24 |
GNL(Get Next Line) 문제 이해하기 (0) | 2021.02.25 |
netwhat 문제 풀이 (0) | 2021.02.20 |