Windows अनाम पाइप वास्तव में साधारण पाइप हैं, और वे अपने UNIX समकक्षों की तरह व्यवहार करते हैं: वे एकदिशात्मक हैं और संचार करने वाली प्रक्रियाओं के बीच पैरेंट-चाइल्ड संबंध रखते हैं। पढ़ने और लिखने के लिए सामान्य `ReadFile()` और `WriteFile()` फंक्शन का उपयोग किया जाता है। Windows API पाइप बनाने के लिए `CreatePipe()` फंक्शन का उपयोग करता है जिसे चार पैरामीटर पास किए जाते हैं।
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;
SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
ZeroMemory(&pi, sizeof(pi));
if(!CreatePipe(&ReadHandle, &WriteHandle, &sa, 0)) {
fprintf(stderr, "Create Pipe Failed");
return 1;
}
GetStartupInfo(&si);
si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
si.hStdInput = ReadHandle;
si.dwFlags = STARTF_USESTDHANDLES;
SetHandleInformation(WriteHandle, HANDLE_FLAG_INHERIT, 0);
CreateProcess(NULL, "child.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
CloseHandle(ReadHandle);
if(!WriteFile(WriteHandle, message, BUFFER_SIZE, &written, NULL))
fprintf(stderr, "Error writing to pipe.");
CloseHandle(WriteHandle);
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
चाइल्ड प्रक्रिया
#include <stdio.h>
#include <windows.h>
#define BUFFER_SIZE 25
int main(VOID) {
HANDLE ReadHandle;
CHAR buffer[BUFFER_SIZE];
DWORD read;
ReadHandle = GetStdHandle(STD_INPUT_HANDLE);
if(ReadFile(ReadHandle, buffer, BUFFER_SIZE, &read, NULL))
printf("child read %s", buffer);
else
fprintf(stderr, "Error reading from pipe");
return 0;
}