APUE 독서노트 - 제15장 - 프로세스 간 통신

4745 단어 APUE

파이프


파이프 생성(pipe 함수)

#include 
int pipe(int fd[2);

fd[0]는 읽기 전용으로 열리고 fd[1]은 쓰기 전용으로 열립니다.

제한성


(1) 파이프는 반이중으로 되어 있고 데이터는 한 방향으로만 흐를 수 있다. (2) 친연관계가 있는 프로세스 사이에만 사용할 수 있다. (3) 이름이 없는 파이프의 버퍼는 유한하다. 상수 PIPEBUF 정의(5) 파이프가 전송하는 것은 무형식 바이트 흐름입니다. 이 때문에 파이프의 읽기와 쓰기는 데이터의 형식을 미리 정해야 합니다.

파이프가 프로세스를 동기화하는 다섯 가지 함수


TELL_WAIT、TELL_PARENT、TELL_CHILD、WAIT_PARENT、WAIT_CHILD
#include "apue.h"

static int  pfd1[2], pfd2[2];

void
TELL_WAIT(void)
{
    if (pipe(pfd1) < 0 || pipe(pfd2) < 0)
        err_sys("pipe error");
}

void
TELL_PARENT(pid_t pid)
{
    if (write(pfd2[1], "c", 1) != 1)
        err_sys("write error");
}

void
WAIT_PARENT(void)
{
    char    c;

    if (read(pfd1[0], &c, 1) != 1)
        err_sys("read error");

    if (c != 'p')
        err_quit("WAIT_PARENT: incorrect data");
}

void
TELL_CHILD(pid_t pid)
{
    if (write(pfd1[1], "p", 1) != 1)
        err_sys("write error");
}

void
WAIT_CHILD(void)
{
    char    c;

    if (read(pfd2[0], &c, 1) != 1)
        err_sys("read error");

    if (c != 'c')
        err_quit("WAIT_CHILD: incorrect data");
}

함수 popen과 pclose


파이프를 만들고, fork의 하위 프로세스를 만들고, 사용하지 않은 파이프를 닫고, 셸 명령을 실행하고, 명령이 끝날 때까지 기다립니다.
#include 
FILE *popen(const char *command, const char *type);
int pclose(FILE *fp);

함수popen은 fork를 먼저 실행한 다음 exec를 호출하여 cmdstring을 실행하고 표준 입출력 파일 포인터를 되돌려줍니다.type이 "r"이면 파일 포인터가 cmdstring의 표준 출력에 연결되고 type이 "w"이면 파일 포인터가 cmdstring의 표준 입력에 연결됩니다

협동 진행 과정


하나의 필터 프로그램은 특정한 필터 프로그램의 입력을 생성하고, 이 필터 프로그램의 출력을 읽으며, 이 필터 프로세스는 협동 프로세스가 된다

FIFO


FIFO 생성
#include 
int mkfifo(const char *path, mode_t mode);
int mkfifoat(int fd, const char *path, mode_t mode);

이름 파이프는 오픈으로 열어야 하고 오픈할 때 O 로NONBLOCK 플래그는 차단되지 않음을 나타냅니다.
두 가지 용도(1)셸 명령은 FIFO를 사용하여 데이터를 한 파이프에서 다른 파이프로 전송할 때 중간 임시 파일을 만들 필요가 없다(2) 클라이언트 프로세스-서버 프로세스 응용 프로그램에서 FIFO는 집합점에서 클라이언트 프로세스와 서버 프로세스 둘 사이에 데이터를 전달하는 데 사용된다.
이름 파이프는 FIFO의 파일 형식으로 파일 시스템에 존재하고 상관없는 프로세스도 서로 FIFO를 통해 데이터를 교환할 수 있다. FIFO는 선진적인 선출(first in first out)을 엄격히 따르고 파이프와 FIFO에 대한 읽기는 항상 처음부터 끝까지 데이터를 되돌려준다.그것들은 lseek () 같은 파일 위치 추적 작업을 지원하지 않습니다

좋은 웹페이지 즐겨찾기