Computer >> 컴퓨터 >  >> 프로그램 작성 >> C 프로그래밍

Windows 익명 파이프

<시간/>

Windows 익명 파이프는 실제로 일반 파이프이며 UNIX 파이프와 유사하게 작동합니다. 즉, 단방향이며 통신 프로세스 간에 부모-자식 관계를 사용합니다. 또한 파이프에 대한 읽기 및 쓰기는 일반 ReadFile() 및 WriteFile() 함수로 수행할 수 있습니다. Windows API는 4개의 매개변수가 전달되는 파이프를 생성하기 위해 CreatePipe() 함수를 사용합니다. 매개변수는

에 대해 별도의 핸들을 제공합니다.
  • 읽기 및

  • 파이프에 쓰기

  • 자식 프로세스가 파이프 핸들을 상속하도록 지정하는 데 사용되는 STARTUPINFO 구조의 인스턴스입니다.

  • 파이프의 크기(바이트)를 지정할 수 있습니다.

Windows에서는 UNIX 시스템과 달리 프로그래머가 자식 프로세스가 상속할 속성을 지정해야 합니다. 이것은 먼저 핸들을 상속할 수 있도록 SECURITY ATTRIBUTES 구조를 초기화한 다음 표준 입력 또는 표준 출력에 대한 자식 프로세스의 핸들을 파이프의 읽기 또는 쓰기 핸들로 리디렉션하여 수행됩니다. 자식이 파이프에서 읽을 때 부모는 자식의 표준 입력을 파이프의 읽기 핸들로 리디렉션해야 합니다. 파이프는 반이중 방식이므로 자식이 파이프의 쓰기 끝을 상속하지 못하도록 해야 합니다.

아래 코드에서 부모 프로세스가 자식과 통신하기 위해 익명 파이프를 생성하는 것을 볼 수 있습니다. -

예시

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#define BUFFER SIZE 25
int main(VOID) {
   HANDLE ReadHandle, WriteHandle;
   STARTUPINFO si;
   PROCESS INFORMATION pi;
   char message[BUFFER SIZE] = "Greetings";
   DWORD written;
   /* set up security attributes to allow pipes to be inherited */
   SECURITY ATTRIBUTES sa = {sizeof(SECURITY ATTRIBUTES), NULL, TRUE};
   /* allocate memory */
   ZeroMemory(π, sizeof(pi));
   /* create the pipe */
   if (!CreatePipe(&ReadHandle, &WriteHandle, &sa, 0)) {
   fprintf(stderr, "Create Pipe Failed"); return 1; }
   /* establishing the START INFO structure for the child process*/
   GetStartupInfo(&si);
   si.hStdOutput = GetStdHandle(STD OUTPUT HANDLE);
   /* redirecting standard input to the read end of the pipe */
   si.hStdInput = ReadHandle;
   si.dwFlags = STARTF USESTDHANDLES;
   /* don’t allow the child inheriting the write end of pipe */
   SetHandleInformation(WriteHandle, HANDLE FLAG INHERIT, 0);
   /* create the child process */
   CreateProcess(NULL, "child.exe", NULL, NULL, TRUE, /* inherit handles */ 0, NULL, NULL, &si, π);
   /* close the unused end of the pipe */ CloseHandle(ReadHandle);
   /* the parent writes to the pipe */
   if(!WriteFile(WriteHandle, message, BUFFER SIZE, &written, NULL))
   fprintf(stderr, "Error writing to pipe.");
   /* close the write end of the pipe */ CloseHandle(WriteHandle);
   /* wait for the child to exit */ WaitForSingleObject(pi.hProcess,INFINITE);        
   CloseHandle(pi.hProcess);
   CloseHandle(pi.hThread);
   return 0;
}

Windows 익명 파이프 - 상위 프로세스

부모는 파이프에 쓰기 전에 먼저 파이프의 사용되지 않은 읽기 끝을 닫습니다. 파이프에서 읽는 자식 프로세스는 아래 코드와 같습니다 -

#include<stdio.h>
#include<windows.h>
#define BUFFER SIZE 25
int main(VOID){
   HANDLE Readhandle;
   CHAR buffer[BUFFER SIZE];
   DWORD read;
   /* getting the read handle of the pipe */
   ReadHandle = GetStdHandle(STD INPUT HANDLE);
   /* the child reads from the pipe */
   if (ReadFile(ReadHandle, buffer, BUFFER SIZE, &read, NULL))
      printf("child read %s", buffer);
   else
      fprintf(stderr, "Error reading from pipe");
   return 0;
}

Windows 익명 파이프 - 자식 프로세스