Pipex Functions
아래의 함수들은 pipex 과제를 하며 많이 사용하게 되는 대표적인 함수들이다. 더 알고싶다면 구글링을 하거나 man function_name 을 쳐보자!
fork()
포크는 새 프로세스를 만드는 시스템 호출이다.
포크를 한 origin process를 부모 프로세스라고 하고, 포크하여 새로 만들어지게 된 프로세스를 자식 프로세스라고 한다. (프로세스가 분기된다!)
유의해야 될 점은,
•
자식 프로세스는 고유한 프로세스 ID를 가집니다. (pid = 0)
•
자식 프로세스는 고유의 메모리 공간을 가집니다. (두 프로세스는 각각 독립된 별도의 가상 메모리 공간을 가지게 된다.)
•
자식 프로세스는 부모 프로세스의 file descriptor의 복사본을 가집니다. 부모와 자식 프로세스의 file descriptor는 같은 파일을 가리킵니다.
pipe()
파이프는 프로세스 입장에서는 파일/표준스트림과 같다. 파이프 함수를 사용하여 파이프를 만든 뒤, 동일한 fd테이블(복사한 테이블이니까)을 포크로 복사하게 되면, 두 프로세스는 서로 연결된 파이프 스트림을 가지게 된다. 그리고 두 프로세스는 이러한 파이프 스트림을 통해 통신하게 되는 것이다!
stdin이 파일에서 프로세스로, stdout이 프로세스에서 파일로 이어지는 것과는 달리, pipe는 프로세스→프로세스로 이루어진다.
+) pipe()함수를 호출하게 되면, 그 결과로 두개의 fd가 제공되는데, 이러한 fd는 각각 하나는 읽는데에, 다른하나는 쓰이는 데에 사용된다.
dup2(int fd, int fd2)
fd의 새로운 서술자의 값을 fd2로 지정한다! (fd가 포인팅하고 있는 값을 fd2가 포인팅하고 있는 값으로 지정한다고 이해하면 될 듯!)만약 fd2가 열려있으면 해당 파일을 닫은 다음 복제가 된다. 쉽게 생각하기 위해서는 fd2의 값이 가리키고 있는 값이 fd가 가리키고 있는 값으로 변경이 된다고 생각하면 편하다.
아래와 같은 코드가 있다면, dup2 함수를 실행하게 되면 아래 그림처럼 파일 디스크립터가 가리키고 있는 open file table의 값이 변한다.
#define STDOUT_FILENO 1;
dup2(fd1, STDOUT_FILENO);
C
복사
성공하게되면 새로운 fd값을 반환하고, 실패하면 -1 을 반환한다.