본문 바로가기
Computer Science/UNIX & Linux

[UNIX/Linux] ep9+) 파이프 함수 실습

by 클레어몬트 2024. 11. 4.

hw1. pipe() 함수를 사용해 부모 프로세스와 자식 프로세스 간에 대화가 가능한 양방향 통신이 되도록 프로그램을 작성하시오

(Example : parent-쓰기부터)

char msg[256], inmsg[256];

 

close(fd1[0]);

close(fd2[1]);

while (1) {

    fgets(msg, sizeof(msg) - 1, stdin);

    write(fd1[1], msg, sizeof(msg) + 1);

    read(fd2[0], msg, 255);

}

 

close (fd1[1]); close (fd2[0]);

while (1) {

    read(fd1[0], inmsg, 255);

    fgets(inmsg, sizeof(inmsg) - 1, stdin);

    write(fd2[1], inmsg, strlen(inmsg) + 1);

}

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    int fd1[2], fd2[2]; // fd1: 부모->자식, fd2: 자식->부모
    pid_t pid;
    char msg[256];
    char inmsg[256];

    // 파이프 두 개 생성
    if (pipe(fd1) == -1 || pipe(fd2) == -1) {
        perror("pipe failed");
        exit(1);
    }

    // 자식 프로세스 생성
    pid = fork();
    if (pid < 0) {
        perror("fork failed");
        exit(1);
    }

    if (pid == 0) { // 자식 프로세스
        close(fd1[1]); // fd1의 쓰기 끝단 닫기 (부모가 쓰고 자식이 읽음)
        close(fd2[0]); // fd2의 읽기 끝단 닫기 (자식이 쓰고 부모가 읽음)

        while (1) {
            // 부모로부터 메시지 읽기
            read(fd1[0], inmsg, sizeof(inmsg));
            printf("Child received: %s", inmsg);

            // 부모에게 메시지 보내기
            printf("Child: Enter message for parent: ");
            fgets(msg, sizeof(msg), stdin);
            write(fd2[1], msg, strlen(msg) + 1);
        }
    } else { // 부모 프로세스
        close(fd1[0]); // fd1의 읽기 끝단 닫기 (부모가 쓰고 자식이 읽음)
        close(fd2[1]); // fd2의 쓰기 끝단 닫기 (자식이 쓰고 부모가 읽음)

        while (1) {
            // 자식에게 메시지 보내기
            printf("Parent: Enter message for child: ");
            fgets(msg, sizeof(msg), stdin);
            write(fd1[1], msg, strlen(msg) + 1);

            // 자식으로부터 메시지 읽기
            read(fd2[0], inmsg, sizeof(inmsg));
            printf("Parent received: %s", inmsg);
        }
    }
    
    return 0;
}

 

 

 

 

 

 

 

참고 및 출처: 시스템 프로그래밍 리눅스&유닉스(이종원)