C의 파이프 시스템 호출

Pipe System Call C



파이프() Linux 시스템 기능입니다. NS 파이프() 시스템 기능은 다른 Linux 프로세스 간에 통신하는 데 사용되는 파일 설명자를 여는 데 사용됩니다. 요컨대, 파이프() 기능은 Linux에서 프로세스 간 통신에 사용됩니다. 이 기사에서는 Linux에서 pipe() 시스템 함수를 사용하는 방법을 보여 드리겠습니다. 시작하겠습니다.

구문 파이프() 기능은 다음과 같습니다.







정수파이프(정수pipefd[2]);

여기서 pipe() 함수는 프로세스 간 통신을 위한 단방향 데이터 채널을 생성합니다. 당신은 통과 정수 (정수) 유형 배열 pipefd pipe() 함수에 대한 2개의 배열 요소로 구성됩니다. 그런 다음 pipe() 함수는 pipefd 정렬.



의 첫 번째 요소 pipefd 정렬, 피펫[0] 파이프에서 데이터를 읽는 데 사용됩니다.



의 두 번째 요소 pipefd 정렬, 피펫[1] 파이프에 데이터를 쓰는 데 사용됩니다.





성공하면 pipe() 함수는 0을 반환합니다. 파이프 초기화 중에 오류가 발생하면 pipe() 함수는 -1을 반환합니다.

pipe() 함수는 헤더에 정의되어 있습니다. unistd.h . C 프로그램에서 pipe() 함수를 사용하려면 헤더를 포함해야 합니다. unistd.h 다음과 같이:



#포함하다

pipe() 시스템 기능에 대한 자세한 내용은 다음 명령을 사용하여 pipe() 매뉴얼 페이지를 확인하십시오.

$ 남자2파이프
파이프의 매뉴얼 페이지().

예 1:

첫 번째 예의 경우 새 C 소스 파일을 만듭니다. 1_파이프.c 다음 코드 줄을 입력합니다.

#포함하다
#포함하다
#포함하다

정수기본(무효의) {
정수pipefds[2];

만약(파이프(pipefds) == -1) {
오류 ('파이프');
출구 (EXIT_FAILURE);
}

인쇄 ('읽기 파일 설명자 값: %dN',pipefds[0]);
인쇄 ('파일 설명자 값 쓰기: %dN',pipefds[1]);

반품EXIT_SUCCESS;
}

여기에 pipe()의 헤더 파일을 포함했습니다. unistd.h 먼저 다음 줄로.

#포함하다

그런 다음, 기본() 함수, 내가 정의한 pipefds 다음 행이 있는 2요소 정수 배열.

정수pipefds[2];

그런 다음 pipe() 함수를 실행하여 파일 설명자 배열을 초기화했습니다. pipefds 다음과 같이.

파이프(pipefds)

또한 pipe() 함수의 반환 값을 사용하여 오류를 확인했습니다. 나는 사용했다 출구() 파이프 기능이 실패할 경우 프로그램을 종료하는 기능입니다.

만약(파이프(pipefds) == -1) {
오류 ('파이프');
출구 (EXIT_FAILURE);
}

그런 다음 읽기 및 쓰기 파이프 파일 설명자의 값을 인쇄했습니다. pipefds[0] 그리고 pipefds[1] 각기.

인쇄 ('읽기 파일 설명자 값: %dN',pipefds[0]);
인쇄 ('파일 설명자 값 쓰기: %dN',pipefds[1]);

프로그램을 실행하면 다음과 같은 출력이 표시되어야 합니다. 보시다시피 read pipe 파일 디스크립터의 값은 pipefds[0] ~이다 파이프 파일 디스크립터 작성 pipefds[1] ~이다 4 .

예 2:

다른 C 소스 파일 생성 2_파이프.c 다음 코드 줄을 입력합니다.

#포함하다
#포함하다
#포함하다
#포함하다

정수기본(무효의) {
정수pipefds[2];
완충기[5];

만약(파이프(pipefds) == -1) {
오류 ('파이프');
출구 (EXIT_FAILURE);
}

*= '4128 0';

인쇄 ('파이프에 PIN을 쓰는 중...N');
쓰다(pipefds[1],, 5);
인쇄 ('완료.NN');

인쇄 ('파이프에서 PIN을 읽는 중...N');
읽다(pipefds[0],완충기, 5);
인쇄 ('완료.NN');

인쇄 ('파이프의 PIN: %sN',완충기);

반품EXIT_SUCCESS;
}

이 프로그램은 기본적으로 파이프에 쓰는 방법과 파이프에서 작성한 데이터를 읽는 방법을 보여줍니다.

여기에 4자리 PIN 코드를 저장했습니다. 정렬. 배열의 길이는 5입니다(NULL 문자 포함).

*= '4128 0';

C에서 각 ASCII 문자의 크기는 1바이트입니다. 따라서 파이프를 통해 4자리 PIN을 보내려면 파이프에 5바이트(4 + 1 NULL 문자)의 데이터를 작성해야 합니다.

5바이트의 데이터를 쓰려면( ) 파이프에, 나는 사용 쓰다() 쓰기 파이프 파일 설명자를 사용하는 함수 pipefds[1] 다음과 같이.

쓰다(pipefds[1],, 5);

이제 파이프에 일부 데이터가 있으므로 다음을 사용하여 파이프에서 읽을 수 있습니다. 읽다() 파이프 파일 설명자 읽기에 대한 함수 pipefds[0] . 5바이트의 데이터를 작성했기 때문에( )를 파이프에 넣으면 파이프에서도 5바이트의 데이터를 읽습니다. 읽은 데이터는 완충기 문자 배열. 파이프에서 5바이트의 데이터를 읽을 때 완충기 문자 배열은 길이가 5바이트 ​​이상이어야 합니다.

나는 정의했다 완충기 시작 부분의 문자 배열 기본() 기능.

완충기[5];

이제 파이프에서 PIN을 읽고 저장할 수 있습니다. 완충기 다음 줄이 있는 배열입니다.

읽다(pipefds[0],완충기, 5);

이제 파이프에서 PIN을 읽었으므로 다음을 사용하여 인쇄할 수 있습니다. printf() 평소와 같이 기능합니다.

인쇄 ('파이프의 PIN: %sN',완충기);

프로그램을 실행하면 보시는 바와 같이 올바른 출력이 표시됩니다.

예 3:

새 C 소스 파일 만들기 3_파이프.c 다음 코드 줄에 입력하십시오.

#포함하다
#포함하다
#포함하다
#포함하다
#포함하다
정수기본(무효의) {
정수pipefds[2];
*;
완충기[5];

만약(파이프(pipefds) == -1) {
오류 ('파이프');
출구 (EXIT_FAILURE);
}

pid_t pid=포크();

만약(PID== 0) { // 자식 프로세스에서
= '4821 0'; // 보낼 PIN
닫다(pipefds[0]); // 읽기 fd를 닫습니다.
쓰다(pipefds[1],, 5); // 파이프에 PIN 쓰기

인쇄 ('자식에서 PIN을 생성하고 부모에게 보내는 중...N');
(2); // 의도적인 지연
출구 (EXIT_SUCCESS);
}

만약(PID> 0) { // 메인 프로세스에서
기다리다(없는); // 자식 프로세스가 끝날 때까지 기다립니다.
닫다(pipefds[1]); // 닫기 쓰기 fd
읽다(pipefds[0],완충기, 5); // 파이프에서 PIN 읽기
닫다(pipefds[0]); // 읽기 fd를 닫습니다.

인쇄 ('부모님이 PIN '%s'을(를) 받았습니다.N',완충기);
}

반품EXIT_SUCCESS;
}

이 예에서는 프로세스 간 통신에 파이프를 사용하는 방법을 보여주었습니다. 파이프를 사용하여 자식 프로세스에서 부모 프로세스로 PIN을 보냈습니다. 그런 다음 상위 프로세스의 파이프에서 PIN을 읽고 상위 프로세스에서 인쇄합니다.

먼저 fork() 함수를 사용하여 자식 프로세스를 만들었습니다.

pid_t pid=포크();

그런 다음 자식 프로세스( PID == 0 ), 나는 다음을 사용하여 파이프에 PIN을 썼습니다. 쓰다() 기능.

쓰다(pipefds[1],, 5);

PIN이 자식 프로세스에서 파이프에 기록되면 부모 프로세스( PID > 0 )를 사용하여 파이프에서 읽습니다. 읽다() 기능.

읽다(pipefds[0],완충기, 5);

그런 다음 상위 프로세스는 다음을 사용하여 PIN을 인쇄했습니다. printf() 평소와 같이 기능합니다.

인쇄 ('부모님이 PIN '%s'을(를) 받았습니다.N',완충기);

보시다시피 프로그램을 실행하면 예상한 결과가 나옵니다.

예 4:

새 C 소스 파일 만들기 4_파이프.c 다음 코드 줄에 입력하십시오.

#포함하다
#포함하다
#포함하다
#포함하다
#포함하다

#define PIN_LENGTH 4
#define PIN_WAIT_INTERVAL 2

무효의getPIN([PIN_LENGTH+ 1]) {
샌드 (getpid() +getppid());

[0] = 49 + () % 7;

~을위한(정수NS= 1;NS<PIN_LENGTH;NS++) {
[NS] = 48 + () % 7;
}

[PIN_LENGTH] = ' 0';
}


정수기본(무효의) {
동안(1) {
정수pipefds[2];
[PIN_LENGTH+ 1];
완충기[PIN_LENGTH+ 1];

파이프(pipefds);

pid_t pid=포크();

만약(PID== 0) {
getPIN(); // PIN 생성
닫다(pipefds[0]); // 읽기 fd를 닫습니다.
쓰다(pipefds[1],,PIN_LENGTH+ 1); // 파이프에 PIN 쓰기

인쇄 ('자식에서 PIN을 생성하고 부모에게 보내는 중...N');

(PIN_WAIT_INTERVAL); // 의도적으로 PIN 생성을 지연시킵니다.

출구 (EXIT_SUCCESS);
}

만약(PID> 0) {
기다리다(없는); // 자식이 끝날 때까지 기다림

닫다(pipefds[1]); // 닫기 쓰기 fd
읽다(pipefds[0],완충기,PIN_LENGTH+ 1); // 파이프에서 PIN 읽기
닫다(pipefds[0]); // 읽기 fd를 닫습니다.
인쇄 ('부모가 자녀로부터 PIN '%s'을(를) 받았습니다.NN',완충기);
}
}

반품EXIT_SUCCESS;
}

이 예는 다음과 같습니다. 실시예 3 . 유일한 차이점은 이 프로그램이 지속적으로 자식 프로세스를 만들고, 자식 프로세스에서 PIN을 생성하고 파이프를 사용하여 PIN을 부모 프로세스로 보낸다는 것입니다.

그런 다음 상위 프로세스는 파이프에서 PIN을 읽고 인쇄합니다.

이 프로그램은 PIN_WAIT_INTERVAL초마다 새로운 PIN_LENGTH PIN을 생성합니다.

보시다시피 프로그램은 예상대로 작동합니다.

를 눌러 프로그램을 중지할 수 있습니다. + .

이것이 C 프로그래밍 언어에서 pipe() 시스템 호출을 사용하는 방법입니다. 이 기사를 읽어 주셔서 감사합니다.