[42Seoul] pipex 가이드
0. 과제 설명
프로세스간 통신을 도와주는 pipe에 대해 이해하고 사용해보자.
1. Pipe
1-1. IPC(Inter Process Communication)
프로세스란 메모리에 올라와 실행되고 있는 프로그램을 말한다. 각각의 프로세스는 고유의 메모리 공간을 가지기 때문에 한 프로세스가 다른 프로세스의 데이터에 접근하는 것이 불가능하다. 이런 문제를 해결하기 위해 여러가지 방법이 있는데, 이런 방법들을 IPC라고 한다.
1-2. pipe
pipe는 IPC의 하나로, 임시 파일(pipe)을 만들고 프로세스의 결과를 해당 파일에 저장, 다음 프로세스가 해당 파일에서 이전 결과를 읽어와 사용하는 식으로 프로세스간에 소통한다.
예를 들어, 다음과 같은 명령어가 있다고 하자.
ls | cat
ls
명령어는 현재 디렉토리에 있는 파일들의 목록을 보여주고, cat
명령어는 입력으로 받은 내용을 출력해준다. cat
명령어를 단일로 사용했을 때는 유저가 내용을 입력할 때까지 기다리지만, 위와 같이 실행하면 ls
명령어의 결과물이 pipe(|)에 저장되고, cat
은 유저의 input대신 pipe에 저장된 내용을 입력으로 받아와 명령어를 실행한다. 따라서 위 명령어의 출력은 ls
의 출력과 같을 것이다.
그렇다면 infile이라는 파일이 있다고 할 때, 아래 명령어의 결과는 어떨까?
cat < infile | ls
< infile
은 입력을 infile로 하겠다는 의미이다. 즉, cat < infile
은 infile 안의 내용을 파이프에 쓰게 된다. 하지만 ls
는 입력이 필요없는, 현재 디렉토리의 파일들을 출력해주는 명령어이므로 앞의 파이프에 내용이 있어도 신경쓰지않고 ls
명령어의 결과를 그대로 출력하게 된다. 따라서 위 명령어의 결과는 ls
의 결과와 같다.
2. Redirection
위에서 cat < infile
은 뒤에 오는 파일(infile)을 입력으로 한다고 설명했다. 조금 더 정확히 말하면 표준 입력으로 연결되어 있는 fd 0번을 infile로 바꿔서 연결시킨다는 말이다. cat
은 fd 0번에서 입력을 받도록 프로그래밍 되어 있는데, fd 0번을 infile로 연결시켜 놨으므로 표준 입력이 아닌 infile의 내용을 받아와 출력하게 되는 것이다. 이처럼 프로그램이나 명령어의 입출력을 파일이나 다른 입출력 장치로 바꾸는 것을 redirection이라고 한다.
리다이렉션은 4가지로 구분할 수 있다.
<
: 표준 입력에 연결되어 있는 fd 0번을<
뒤에 오는 파일로 연결한다.>
: 표준 출력에 연결되어 있는 fd 1번을>
뒤에 오는 파일로 연결한다.>
뒤의 파일이름에 해당하는 파일을 만들고 결과물을 거기에 저장한다. 만약 해당 이름의 파일이 이미 존재하면, 기존 내용이 사라지고 마지막에 실행한 명령어의 결과가 저장되므로 주의해야 한다.<<
: heredoc이라고 불리며,<<
뒤에 오는 문자가 입력될 때까지 계속 입력을 받는다. 예를 들어,<< eof
이면 eof를 입력하기 전까지 계속 입력을 받고, 입력 받는 내용들은 임시 파일에 저장된다. 종료 문자인 eof가 입력되면 표준 입력에 연결되어 있는 fd 0번을 해당 임시 파일로 연결한다. 명령어가 다 실행되고 나면 임시 파일은 삭제된다.>>
표준 출력에 연결되어 있는 fd 1번을>>
뒤에 오는 파일로 연결한다. 만약>>
뒤의 파일 이름에 해당하는 파일이 이미 존재하면, 그 파일의 내용 뒤에 이어쓰기한다.
3. 주의할 점 및 팁
sleep 3 | sleep 3 | sleep 3
의 경우 병렬 실행되어 9초가 아닌 3초를 sleep 해야 한다.- lsof 명령어를 사용해 fd leak이 나지 않는지 확인한다.
cat /dev/random | head -1
명령어를 넣어 보자. - 파이프를 여러 개 사용하는 경우, 첫 명령어, 마지막 명령어, 그 외 중간에 있는 명령어로 구분하여 리다이렉션 방향을 고민해야 한다.
- 과제를 하면서 이 재생목록이 정말 큰 도움이 됐다. 유튜브 코드볼트
Leave a comment