C 언어에서 파이프 기능을 사용하는 방법

How Use Pipe Function C Language



파이프는 프로세스 간의 통신 매체입니다. 한 프로세스는 파이프에 데이터를 쓰고 다른 프로세스는 파이프에서 데이터를 읽습니다. 이 기사에서는 pipe() 함수를 사용하여 C 언어를 사용하여 개념을 구현하는 방법을 살펴봅니다.

파이프 정보

파이프에서 데이터는 FIFO 순서로 유지됩니다. 즉, 파이프의 한쪽 끝에 순차적으로 데이터를 쓰고 파이프의 다른 쪽 끝에서 동일한 순차적인 순서로 데이터를 읽는 것을 의미합니다.







파이프에서 읽는 프로세스가 있지만 아직 파이프에 쓰지 않은 다른 프로세스가 없으면 read는 파일 끝을 반환합니다. 프로세스가 파이프에 쓰기를 원하지만 파이프에 읽기 위해 연결된 다른 프로세스가 없는 경우 이는 오류 조건이며 파이프는 SIGPIPE 신호를 생성합니다.



헤더 파일

#포함하다

통사론



정수파이프(정수필데스[2])

인수

이 함수는 두 개의 정수 배열( 필데스 ). 파일데스[0] 파이프에서 읽는 데 사용되며 파일데스[1] 파이프에 쓰는 데 사용됩니다. 파이프에서 읽으려는 프로세스는 닫아야 합니다. 파일데스[1], 파이프에 쓰고자 하는 프로세스는 닫혀야 합니다. 파일데스[0] . 파이프의 불필요한 끝이 명시적으로 닫히지 않으면 EOF(파일 끝)가 반환되지 않습니다.





반환 값

성공 시, 파이프() 0을 반환하고 실패하면 -1을 반환합니다.

그림으로 표현할 수 있는 파이프() 다음과 같이 기능합니다.



다음은 C 언어에서 파이프 함수를 사용하는 방법을 보여주는 몇 가지 예입니다.

예1

이 예에서 우리는 파이프 기능이 어떻게 작동하는지 볼 것입니다. 단일 프로세스에서 파이프를 사용하는 것은 그다지 유용하지 않지만 아이디어를 얻을 것입니다.

// 예제1.c
#포함하다
#포함하다
#포함하다
#포함하다

정수기본()
{
정수N;
정수필데스[2];
완충기[1025];
*메세지= '안녕, 세계!';

파이프(필데스);
쓰다(필데스[1],메세지, 스트렌 (메세지));

만약 ((N=읽다(필데스[0],완충기, 1024 ) ) > = 0) {
완충기[N] = 0; //문자열 종료
인쇄 ('파이프에서 %d바이트 읽기: '%NS'N',N,완충기);
}
또 다른
오류 ('읽다');
출구 (0);
}

여기에서 우리는 먼저 다음을 사용하여 파이프를 만들었습니다. 파이프() 함수는 다음을 사용하여 파이프에 작성됩니다. 아이보리 [1] 끝. 그런 다음 파이프의 다른 쪽 끝을 사용하여 데이터를 읽었습니다. 파일데스[0] . 파일을 읽고 쓰기 위해 우리는 읽다() 그리고 쓰다() 기능.

예2

이 예에서는 부모 프로세스와 자식 프로세스가 파이프를 사용하여 통신하는 방법을 볼 것입니다.

// 예제2.c
#포함하다
#포함하다
#포함하다
#포함하다
#포함하다

정수기본()
{
정수필데스[2],n바이트;
pid_t 자식 pid;
[] = '안녕, 세상!N';
읽기 버퍼[80];

파이프(필데스);

만약((어린아이=포크()) == -1)
{
오류 ('포크');
출구 (1);
}

만약(어린아이== 0)
{
닫다(필데스[0]);//하위 프로세스는 파이프의 이 끝이 필요하지 않습니다.

/* 파이프의 출력측을 통해 '문자열'을 전송 */
쓰다(필데스[1],, ( 스트렌 ()+1));
출구 (0);
}
또 다른
{
/* 상위 프로세스는 파이프의 출력측을 닫습니다 */
닫다(필데스[1]);//부모 프로세스는 파이프의 이 끝이 필요하지 않습니다.

/* 파이프에서 문자열 읽기 */
n바이트=읽다(필데스[0],읽기 버퍼, 크기(읽기 버퍼));
인쇄 ('문자열 읽기: %s',읽기 버퍼);
}

반품(0);
}

먼저 파이프 함수를 사용하여 하나의 파이프를 만든 다음 자식 프로세스가 분기되었습니다. 그런 다음 자식 프로세스는 읽기 끝을 닫고 파이프에 씁니다. 상위 프로세스는 쓰기 끝을 닫고 파이프에서 읽고 표시합니다. 여기서 데이터 흐름은 자식에서 부모로 가는 한 가지 방법일 뿐입니다.

결론:

파이프() Linux의 강력한 시스템 호출입니다. 이 기사에서는 단방향 데이터 흐름, 하나의 프로세스 쓰기 및 다른 프로세스 읽기만 보았고 양방향 데이터 흐름도 달성할 수 있는 두 개의 파이프를 생성했습니다.