열렬히.뛰기

쌍괄호 : 준비 및 구현

école 42 > pipex > pipex : 진행 상황 > 쌍괄호 : 준비 및 구현

쌍괄호 기호

c
cmd << LIMITER | cmd1 >> file

<< : heredoc

  • 표준 입력을 통해 명령에 넣겠다는 의미
  • LIMITER : 표준 입력 중단 장치

>> : 이어쓰기

  • 파일이 없는 경우 : 새로 만든다.
  • 파일이 있는 경우 : 해당 파일 뒤에 이어서 쓴다.

구현 방향

  • heredoc : 임시 파일을 먼저 만들고 입력을 다 받은 후, 이를 infile의 fd에 넣어주는 방법으로 한다.
  • 이렇게 만들면 임시 파일을 닫아야 하는 고민도 줄어들게 된다.

몇 가지 바꾸기

  1. 기존의 infile 항목은 비워둔다.

  2. 어디부터 어디까지가 limiter인지, 명령인지, outfile인지 확인해야 한다.

  3. >> 의 경우 대상 파일에 덮어쓰기가 아닌 이어서 쓰기를 해야 한다.

    따라서, open()에 들어가는 옵션을 바꿔줘야 한다.

c
tools->outfile_fd = open(tools->outfile, \
				O_RDWR | O_CREAT | O_APPEND, 0644);

heredoc 만들기

fork 되기 전에 부모에서 사전에 만들고, 입력까지 다 받아야 한다!

c
static void	heredoc_start(t_box *tools)
{
	size_t	lim_len;
	char	*str;

	tools->infile_fd = open(HEREDOC_FILE, O_WRONLY | O_CREAT | O_TRUNC, 0644);
	if (tools->infile_fd == -1)
		exit_cmd(NO_FILE, tools);
	lim_len = ft_strlen(tools->limiter);
	while (1)
	{
		write(1, "heredoc> ", 9);
		str = get_next_line(0);
		if (!str)
			break ;
		if (ft_strncmp(tools->limiter, str, lim_len) == 0 && \
				ft_strlen(str) == lim_len + 1)
			break ;
		write(tools->infile_fd, str, ft_strlen(str));
		free(str);
	}
	close(tools->infile_fd);
	tools->infile_fd = open(HEREDOC_FILE, O_RDONLY, 0644);
	if (tools->infile_fd == -1)
		exit_cmd(NO_FILE, tools);
}
  1. 새 파일의 위치를 정한다. (여기서는 HEREDOC_FILE로 미리 지정 : /var/tmp 안에 만드는 것이 좋다.)
  2. 기존 infile의 fd 위치에 넣어준다. open() 옵션을 O_WRONLY | O_CREAT | O_TRUNC 으로 해준다.
  3. 작성한다.
    1. 표준 입력을 계속 받는다.
    2. write()를 이용해 계속 써준다.
    3. 입력이 끝나면 (= NULL 또는 limiter 입력) 쓰는 것을 끝낸다.
  4. 닫고 다시 연다. (중요!!)
    • 닫고 다시 열어주지 않으면, 파일이 가리키는 위치가 파일 맨 끝이므로 명령이 제대로 실행되지 않을 수 있다.
    • 이때 열어줄 때의 open() 옵션은 O_RDONLY로 해준다.