Named Pipes

How do I create named pipe?

명령줄에서는 mkfifo, C에서는 mkfifo(const char *pathname, mode_t mode)로 생성합니다.

named pipe에는 경로명과 명령 모드를 설정할 수 있습니다. named pipe는 디스크의 공간을 차지하지 않습니다. named pipe가 만들어질 때 운영체제가 본질적으로 하는 일은 unnamed pipe를 만들어 named pipe가 가리키게 하는 것입니다. 프로세스에 forking 없이 시작되었다면 단지 프로그래밍의 편의를 위해 사용합니다.(즉, unnamed pipe는 child process에서 file descriptor를 얻을 방법이 없습니다.)

Why is my pipe hanging?

적어도 하나의 reader와 하나의 writer가 있기 전까지는 Named pipe에서 read와 write는 중단됩니다.

1$ mkfifo fifo
1$ echo Hello > fifo
# This will hang until I do this on another terminal or another process
2$ cat fifo
Hello

위의 경우 fifo라고 이름지어진 named pipe가 생성되어 Hello가 write되었을 때 cat 전까지 hang되어 있는 상태입니다.

named pipe에 어떤 open이 호출될 때 커널은 다른 프로세스가 반대편 open을 호출하기 전까지 블록합니다. 즉, echo가 open(.., O_WRONLY)를 호출하지만, cat이 open(.., O_RDONLY)를 호출할 때까지 블록됩니다. 그러고 나면 프로그램은 계속 진행됩니다.


Race condition with named pipes.

다음 프로그램은 무엇이 잘못되었을까요?


// Program 1

int main() {
    int fd = open("fifo", O_RDWR | O_TRUNC);
    write(fd, "Hello!", 6);
    close(fd);
    return 0;
}

//Program 2
int main() {
    char buffer[7];
    int fd = open("fifo", O_RDONLY);
    read(fd, buffer, 6);
    buffer[6] = '\0';
    printf("%s\n", buffer);
    return 0;
}


위 프로그램은 race condition 때문에 끝까지 hello를 출력하지 않습니다. 첫 번째 프로세스에서 pipe를 두 가지 허가 조건으로 open했지만, OS에게 스스로가 reader라고 알려주었기 때문에 reader를 기다리지 않을 것입니다. 때때로 위의 코드가 작동하는 것처럼 보일수도 있겠지만, 그건 아래와 같이 코드가 동작하기 때문입니다.


Process 1Process 2
open(O_RDWR) & write()
open(O_RDONLY) & read()
close() & exit()
print() & exit()

동작하지 않을 경우에는,


Process 1Process 2
open(O_RDWR) & write()
close() & exit()(Named pipe is destroyed)
(Blocks indefinitely)open(O_RDONLY)


위오 같이 동작합니다.

Posted by 몰랑&봉봉
,