Các đường ống ẩn danh của Windows thực ra là các đường ống Thông thường và chúng hoạt động tương tự như các bản sao UNIX của chúng:chúng là một chiều và sử dụng các mối quan hệ cha-con giữa các quá trình giao tiếp. Ngoài ra, việc đọc và ghi vào đường ống có thể được thực hiện bằng các hàm ReadFile () và WriteFile () thông thường. API Windows sử dụng hàm CreatePipe () để tạo đường dẫn, được truyền bốn tham số. Các tham số cung cấp các xử lý riêng biệt cho
-
đọc và
-
ghi vào ống dẫn
-
Một phiên bản của cấu trúc STARTUPINFO, được sử dụng để chỉ định rằng quy trình con sẽ kế thừa các chốt của đường ống.
-
kích thước (tính bằng byte) của đường ống có thể được chỉ định.
Windows yêu cầu lập trình viên chỉ định thuộc tính nào mà tiến trình con sẽ kế thừa, Không giống như hệ thống UNIX. Điều này được thực hiện trước tiên bằng cách khởi tạo cấu trúc AN NINH ATTRIBUTES cho phép các chốt được kế thừa và sau đó chuyển hướng các xử lý của quy trình con cho đầu vào tiêu chuẩn hoặc đầu ra tiêu chuẩn đến tay cầm đọc hoặc ghi của đường ống. Vì trẻ sẽ đọc từ ống, cha mẹ phải chuyển hướng đầu vào tiêu chuẩn của trẻ đến tay cầm đọc của ống. Vì các đường ống là bán song công, nên phải cấm phần tử con kế thừa phần cuối ghi của đường ống.
Trong đoạn mã dưới đây, chúng ta có thể thấy quy trình cha tạo một đường ống ẩn danh để giao tiếp với con của nó -
Ví dụ
#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; }
Đường dẫn ẩn danh trong Windows - quy trình mẹ
Đầu tiên cha mẹ đóng phần cuối đã đọc chưa sử dụng của nó của ống dẫn, trước khi ghi vào ống dẫn. Tiến trình con đọc từ ống dẫn được hiển thị trong đoạn mã dưới đây -
#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; }
Đường ống ẩn danh trong Windows - tiến trình con