파이프 라인 프로세스 통신

몇몇 프로세스 간 통신 시스템에 파이프 (배관), 네임드 파이프 (네임드 파이프), 신호 량 (semophore), 메시지 큐 (마사지 큐), 신호 (신호), 공유 메모리 (공유 메모리), 소켓 (소켓 ).

개념 파이프 라인

파이프 메커니즘은 프로세스 간의 양방향 통신이다. 일방향 데이터 송신 파이프 때문에, 관은 또한 반이중 파이프라고도. 그래서 파이프 라인은 몇 가지 제한 사항이 있습니다.

  · 데이터 전용 (쓰기 파이프 라인, 또 다른 읽기 파이프 라인이있는) 다른 프로세스에 하나 개의 프로세스로 흐르고, 당신은 전이중 통신을 원하는 경우,이 두 개의 파이프 라인을 구축 할 것입니다.

  · 단지 부모와 자식이나 형제 프로세스 사이의 통신에 사용되는 파이프 라인은, 즉 파이프 라인은 유전 관계 간 통신에 사용할 수 있습니다, 관련이없는 과정은 파이프 라인을지지 않습니다.

이러한 한계 이외에, 몇몇 단점 도관, 도관 이름이없는 등, 배관의 버퍼 크기, 상기 덕트가 전송되지 않는 바이트 스트림 형식 제한이있다. 이는 입력측 양호한 데이터 포맷 사전 동의의 출력측의 배관을 필요로한다.

파이프 라인에 걸쳐 공정의 경우, 파이프 라인은 메모리에만 존재하는 특별한 파일입니다. 만약 파이프 라인을 생성 할 때, 파이프 라인 시스템은 데이터 버퍼로의 페이지를 할당하고, 두 프로세스 파이프 통신은 판독 버퍼에 기록하여 통신한다.

프로세스 통신 두 파이프가 처리 파이프 라인, 파이프의 타 단부로부터 판독 된 데이터에 데이터를 기록한다. 버퍼의 선두 데이터를 판독 데이터가 판독 될 때 데이터가 파이프 버퍼의 마지막에 추가 할 때마다 기록된다.

2. 파이프와 읽기와 쓰기 만들기

(1) 관로를 만들

이 기능 파이프하여 수행 할 수 있습니다 리눅스에서 파이프 라인을 만듭니다. 0 함수 호출이 성공적으로 반환하고 배열은 두 개의 새로운 파일 기술자를 포함, 에러가 발생하면 -1을 반환합니다. 다음과 같이 함수 프로토 타입입니다

사용법 #include <unistd.h> 
INT 파이프 (INT의 FD [2])

 파이프 단부 [1] 일 수 있으며, 각각 FD [0] 및 FD 설명한다. 이것은 파이프의 작업이 양단에 고정되는 것이 강조되고, 일단 (FD [0])만을 판독하는 판독 소위 파이프 일단 (FD [1])만을 기록하는, 기록 파이프라고 . a는 뒤로 오류가 발생합니다 일단.

파이프가 파일 I를 얻기 위해 파일 조작이다 / O 기능 도관 읽기 ()와 같은 물품 () 등을들 수있다.

파이프 라인 (2)로부터 데이터를 판독

프로세스가 파이프 라인 데이터를 읽을 경우, 파이프 라인에 데이터를 기록하는 처리는 FD 닫아야 동안, 프로세스는, [1] FD 닫아야 [0]. 계통 발생 과정에 대한 파이프 라인 때문에, 그래서 그들은 파일 기술자를 공유했다.

기록은, 입력의 판독 단부가 판독 된 처리가 존재하지 않는 경우 프로세스는 파이프의 단부를 판독 된 데이터를 판독하고, 파이프가 종료 함수는 바이트 수를 판독 리턴 0이다 파이프의 끝 본 쓰기 및 판독 요청 PIPE_BUF 모든 파이프 라인 수익을 기존 데이터 바이트의 수보다 더 큰; PIPE_BUF 요청 바이트의 수보다 그렇지 않은 경우보다, 파이프 라인 반환 기존의 모든 데이터는, 또는 요구 된 바이트 수를 반환합니다.

(3) 파이프 라인의 데이터를 기록

파이프 라인에 데이터를 기록 할 때, 리눅스는 (기록 된 자성을 보장하지 않습니다 자성 어떤 이유로, 작업을 중단 할되지 않은 시간에 운영 체제를 참조하거나하지 않는다, 또는 우리가 완료됩니다 않습니다 , 파이프 라인 버퍼를) 자유 영역이, 쓰기 과정은 읽기 프로세스가 데이터 버퍼를 읽을 경우, 쓰기 프로세스가 차단되어야 할 것이다 작성하려고합니다.

PIPE_BUF 이하 기록 된 바이트의 필요한 수, 다수의 프로세스가 동일한 파이프 쓰면 파이프를 작성할 때 교대 아니다. 그러나, 동시에 다수의 파이프를 쓰는 방법이 있으며, 기록 된 바이트의 수가 소정 공정 조건은 그 기록 동작, 상기 복수의 교대 PIPE_BUF 대응할 수 넘으면.

루틴

#INCLUDE <STDIO.H> 
#INCLUDE <errno.h> 
#INCLUDE <stdlib.h> 
#INCLUDE <SYS / types.h> 
사용법 #include <unistd.h> 
사용법 #include <string.h> 

공극 read_from_pipe (INT의 FD) 
{ 
	문자 메시지 [100] = {0}; 
	읽기 (FD, 메시지, 100); 
	의 printf ( "파이프로부터 판독 : % S \ 없음"메시지); 
} 

무효 write_to_pipe (INT의 FD) 
{ 
	숯불 * 메시지 = "리눅스있는 좋은 시스템 \ n"; 
	쓰기 (FD, 메시지, 나 strlen (메시지) +1); 
} 

무효 메인 () 
{ 
	INT FD [2]; 
	된 pid_t의 PID; 
	stat_val INT; 

	(파이프 (FD)) 경우 
	{ 
		perror는 ( "pipie 만들기에 실패 \ n!"); 
		출구 (1); 
	{ 
		케이스 -1 : 
			; perror는 ( "! 포크 오류 \ N-") 
			. (1) 종료; 
		케이스 0 : 
			닫기 ([. 1] FD); // 쓰기 읽기 닫기 
			read_from_pipe을 (FD [0]); 
			종료 (0); 
		기본값 : 
			닫기 (FD [0]); // 닫기 읽기 쓰기 
			write_to_pipe ([. 1] FD), 
			대기 (stat_val), 
			종료 (0); 
	} 
	반환 0; 
}

 그것을 실행 해보십시오

 

 파이프는 반이중 달성하기 위해 전이중 개의 파이프를 확립함으로써 달성 될 수있다.

 루틴

#INCLUDE <STDIO.H> 
#INCLUDE <errno.h> 
#INCLUDE <stdlib.h> 
#INCLUDE <SYS / types.h> 
사용법 #include <unistd.h> 
사용법 #include <string.h> 


공극 자식 (INT의 RD, INT 중량) 
{ 
	문자 메시지 [100] = {0} * chmsg = "안녕하세요 아빠 \ n"; 
	물품 (중량, chmsg, 나 strlen (chmsg) +1); 
	판독 (RD, 메시지, 100); 
	의 printf ( "아버지 자식 RECV의 메시지 : %의 \ n을", 메시지); 
} 

무효 아버지 (INT의 RD, INT 중량) 
{ 
	문자 메시지 [100] = {0} * famsg = "안녕, 내 아들 \ n"; 
	물품 (중량, famsg, 나 strlen (famsg) +1); 
	판독 (RD, 메시지, 100); 
	의 printf ( "아이의 아버지 RECV의 메시지 : %의 \ 없음"메시지);

	된 pid_t의 PID; 
	stat_val INT; 

	(파이프 (fd0에) || 파이프 (FD1)) 경우 
	{ 
		perror는 ( "만들기 파이프 실패 \ n!"); 
		출구 (1); 
	} 

	) (= 포크 PID; 
	스위치 (PID) 
	{ 
		경우 -1 : 
			perror는 ( "! 포크 오류 \ n"); 
			출구 (1); 
		경우 0 : 
			확대 (fd0에 [1]); 
			확대 (FD1 [0]); 
			자식 (fd0에 [0], FD1 [1]); 
			출구 (0); 
		기본 : 
			확대 (FD1 [1]); 
			확대 (fd0에 [0]); 
			아버지 (FD1 [0] fd0에 [1]); 
			(stat_val) 기다려; 
			출구 (0); 
	} 
	0을 반환; 
}

 영업 실적

 (4) DUP () 및 dup2에 ()

자식 프로세스가 생성되기 전에 파일 기술자가 설정되어 있기 때문에, 그래서 아이는 부모 프로세스의 파일 기술자를 공유 할 수 있습니다. 자식 프로세스가 다른 응용 프로그램을 실행하기 위해 간부 함수를 호출한다면, 그것은 공유 할 수 없습니다. 이 때, 당신은 DUP 사용할 수 있으며, dup2에 자식 프로세스는 사실에, 프로그램이 표준 입력에서 새로운 데이터를 얻기 위해 실행될 때 부모 프로세스에서 입력 데이터를 얻을 수 있습니다, 표준 입력 파일 기술자로 리디렉션됩니다. DUP와 dup2에 기능은 파일 기술자 기능의 사본을 제공합니다.

사용법 #include <unistd.h> 
INT DUP (newfd를 INT); 
dup2에 INT (INT newfd를, newfd INT);

 모두 newfd를 파일 기술자의 복사본을 반환 할 때 DUP와 dup2에 함수 호출이 성공적으로 반환하는 데 실패 -1. 차이는 DUP 함수는 현재 파일 기술자 파일 기술자가 최소가 될 수 반환하고, dup2가 기능 설명 newfd가 허용 가능한 돌려 원하는 매개 변수를 사용하여 파일을 지정할 수 있다는 것입니다. 매개 변수 newfd 지정된 파일 기술자가 열려 있으면, 시스템은 첫 번째 닫습니다 다음 지정된 파일 기술자 매개 변수에 할당 oldfd에. 를 닫지 않고 newfd 동일 newfd를의 duo2의 newfd가 반환하는 경우.

비교 사용 DUP와 dup2에

/ * * DUP / 
PID = 포크 (); 
IF (PID == 0) 
{ 
/ * 근접 서브 프로세스 표준 출력 * / 닫기 (1.);
/ * 표준 출력 도관 * / 상기 입력 복사 . DUP (FD의 [1 ]); 을 execve ( "시험"argv와, 싸다) }

 

/ * * dup2에 / 
PID = 포크 (); IF (PID == 0) { / * / 출력 도관 복사 표준 출력과 표준 출력습니다 dup2가를 (1, FD [2].) 을 execve ( "시험" argv와, 싸다) }

 가시 dup2에 시스템 호출 작업과 같은 기능의 자성의 통합 복사 파일 기술자의 가까운 작동하고 있는지 확인합니다.

 

추천

출처www.cnblogs.com/area-h-p/p/11693701.html