본문 바로가기

교육/42서울

pipe를 연속으로 사용할 경우 반환되는 filedescriptor 값 테스트 (C언어)

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