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