본문 바로가기

C Language

파이프 구조체 설명

파이프 구조체

 

이 구조체는 파이프(pipe)를 사용한 프로세스 간 통신을 구현하는 데 필요한 여러 요소들을 포함하고 있습니다. 

  1. pid_t pid1, pid_t pid2: 두 개의 프로세스 ID를 저장합니다. 이는 fork()로 생성된 자식 프로세스들의 ID를 저장하는 데 사용됩니다
  2. int tube[2]: 파이프를 위한 파일 디스크립터 배열입니다. pipe() 함수로 생성된 파이프의 읽기/쓰기 끝을 저장합니다.
  3. int infile, int outfile: 입력 파일과 출력 파일의 파일 디스크립터를 저장합니다.
  4. char *paths: 환경 변수 PATH의 내용을 저장하는 문자열 포인터입니다.
  5. char **cmd_paths: 명령어의 가능한 경로들을 저장하는 문자열 배열의 포인터입니다.
  6. char **cmd_args: 명령어와 그 인자들을 저장하는 문자열 배열의 포인터입니다.
  7. char *cmd: 실행할 명령어를 저장하는 문자열 포인터입니다.

이 구조체는 pipex라는 이름의 프로그램 또는 함수에서 사용될 것으로 보이며, 두 프로세스 간의 파이프 통신을 관리하고 명령어 실행에 필요한 정보를 저장하는 데 사용됩니다.typedef struct s_pipex {...} t_pipex;라는 구문을 통해, 이후 코드에서는 struct s_pipex 대신 간단히 t_pipex라는 이름으로 이 구조체 타입을 사용할 수 있게 됩니다

 

int tube[2]는 파이프를 생성하고 사용하기 위한 핵심적인 요소입니다. 이 배열은 파이프의 두 끝점을 나타내는 파일 디스크립터를 저장하는 데 사용됩니다.


파이프의 구조
파이프는 단방향 통신 채널로, 한 프로세스에서 다른 프로세스로 데이터를 전송하는 데 사용됩니다1
. 파이프는 두 개의 끝점을 가지고 있습니다:

 

읽기 끝 (Read end)
쓰기 끝 (Write end)

 

tube 배열의 역할
tube 배열은 이 두 끝점에 대한 파일 디스크립터를 저장합니다:
tube: 파이프의 읽기 끝에 대한 파일 디스크립터
tube[1]: 파이프의 쓰기 끝에 대한 파일 디스크립터

 

pipe() 함수와 tube2
pipe() 함수를 호출할 때 tube 배열을 인자로 전달합니다3:

 

if (pipe(tube) == -1) {
    perror("pipe");
    exit(1);
}

 

성공적으로 파이프가 생성되면, pipe() 함수는 tube 배열에 파일 디스크립터를 채웁니다.

 

파이프 사용
파이프가 생성된 후, 프로세스는 이 파일 디스크립터를 사용하여 파이프와 상호작용할 수 있습니다1
:
데이터 쓰기: write(tube[1], data, size)
데이터 읽기: read(tube, buffer, size)
주의사항
파이프는 단방향 통신만 지원합니다. 양방향 통신이 필요한 경우 두 개의 파이프를 사용해야 합니다.
파이프를 사용한 후에는 반드시 파일 디스크립터를 닫아야 합니다. 특히 fork()를 사용할 때, 각 프로세스는 사용하지 않는 파이프의 끝을 닫아야 합니다.
파이프의 버퍼 크기는 일반적으로 운영 체제에 의해 결정되며, PIPE_BUF 상수로 정의됩니다.
이러한 방식으로 tube[2] 배열은 프로세스 간 통신을 위한 파이프의 양 끝점을 효과적으로 관리할 수 있게 해줍니다.