Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

ท่อหน้าต่างนิรนาม


ไปป์ที่ไม่ระบุตัวตนของ Windows เป็นไพพ์ธรรมดา และทำงานคล้ายกับยูนิกซ์คู่หู:เป็นแบบทิศทางเดียวและใช้ความสัมพันธ์แบบพาเรนต์และชายด์ระหว่างกระบวนการสื่อสาร นอกจากนี้ การอ่านและการเขียนไปยังไพพ์สามารถทำได้ด้วยฟังก์ชัน ReadFile() และ WriteFile() ทั่วไป Windows API ใช้ฟังก์ชัน CreatePipe() เพื่อสร้างไพพ์ ซึ่งส่งผ่านพารามิเตอร์สี่ตัว พารามิเตอร์จัดเตรียมแฮนเดิลแยกต่างหากสำหรับ

  • การอ่านและ

  • เขียนถึงท่อ

  • อินสแตนซ์ของโครงสร้าง STARTUPINFO ใช้เพื่อระบุว่าโปรเซสลูกคือการสืบทอดแฮนเดิลของไพพ์

  • สามารถระบุขนาด (เป็นไบต์) ของไปป์ได้

Windows ต้องการให้โปรแกรมเมอร์ระบุแอตทริบิวต์ที่กระบวนการลูกจะสืบทอด แตกต่างจากระบบ UNIX สิ่งนี้ทำได้โดยเริ่มต้นโครงสร้าง SECURITY ATTRIBUTES ก่อน ซึ่งช่วยให้แฮนเดิลได้รับการสืบทอด จากนั้นเปลี่ยนเส้นทางแฮนเดิลของโปรเซสลูกสำหรับอินพุตมาตรฐานหรือเอาต์พุตมาตรฐานไปยังจุดจับอ่านหรือเขียนของไพพ์ เนื่องจากเด็กจะอ่านจากไพพ์ พาเรนต์ต้องเปลี่ยนเส้นทางอินพุตมาตรฐานของเด็กไปยังจุดจับอ่านของไพพ์ เนื่องจากไพพ์เป็นแบบ half duplex จึงจำเป็นต้องห้ามมิให้เด็กรับช่วงปลายเขียนของไพพ์

ในรหัสด้านล่าง เราจะเห็นกระบวนการหลักที่สร้างไปป์ที่ไม่ระบุชื่อเพื่อสื่อสารกับลูกของมัน -

ตัวอย่าง

#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 - กระบวนการลูก