ไปป์ที่ไม่ระบุตัวตนของ 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 - กระบวนการลูก