標籤:發送資訊 efi 處理序間通訊 class cal 資料 編寫 sed soft
要求實現:
- 用具名管道的相關知識及函數,分別編寫伺服器處理序和用戶端進程程式。
- 要求伺服器處理序和用戶端進程程式能夠通過互相傳送資料。
- 當伺服器處理序和用戶端進程中的任何一端輸入“end”時,結束會話。
寫了半天,發現如果只用單個管道的話,非常的困難,進程總是卡住,感覺痛點在於伺服器處理序怎麼主動地像用戶端進程發送資訊,研究了一天還是未解決這個問題。。。
最後是寫了個雙管道的(每個進程都有各自的伺服器和用戶端)來實現的,雖然和要求可能有所出入。。。
#include <Windows.h>#include <stdio.h>HANDLE hPipe, hInput;char writeBuffer[256];char readBuffer[256];DWORD cbRead = 100;BOOL isSelf = false;BOOL fConnected = false;BOOL isExit = false;DWORD WINAPI mThreadFunc(LPVOID lpParam){ while (true) { gets_s(writeBuffer, 256); if (WaitNamedPipe("\\\\.\\pipe\\test2", 1000)) { CallNamedPipe( "\\\\.\\pipe\\test2", writeBuffer, 256, readBuffer, 256, &cbRead, 20000); printf("%s\n", readBuffer); if (strcmp(writeBuffer, "end") == 0) { exit(-1); } } else { if (GetLastError() == ERROR_FILE_NOT_FOUND) { printf("錯誤:進程二沒在運行!\n"); } } }}int main(){ printf("我是進程一。\n\n"); hPipe = CreateNamedPipe( "\\\\.\\pipe\\test1", PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, 3, 512, 512, 0, NULL); hInput = CreateThread(NULL, 0, mThreadFunc, NULL, 0, NULL); CloseHandle(hInput); while (!isExit) { fConnected = ConnectNamedPipe(hPipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED); if (fConnected) { ReadFile(hPipe, readBuffer, 256, 0, NULL); printf("進程二: %s\n", readBuffer); WriteFile(hPipe, "進程一: 我收到了!", 256, 0, NULL); DisconnectNamedPipe(hPipe); if (strcmp(readBuffer, "end") == 0) { isExit = true; } } } CloseHandle(hPipe); return 0;}1.c
#include <Windows.h>#include <stdio.h>HANDLE hPipe, hInput;char writeBuffer[256];char readBuffer[256];DWORD cbRead = 100;BOOL isSelf = false;BOOL fConnected = false;BOOL isExit = false;DWORD WINAPI mThreadFunc(LPVOID lpParam){ while (true) { gets_s(writeBuffer, 256); if (WaitNamedPipe("\\\\.\\pipe\\test1", 1000)) { CallNamedPipe( "\\\\.\\pipe\\test1", writeBuffer, 256, readBuffer, 256, &cbRead, 20000); printf("%s\n", readBuffer); if (strcmp(writeBuffer, "end") == 0) { exit(-1); } } else { if (GetLastError() == ERROR_FILE_NOT_FOUND) { printf("錯誤:進程一沒在運行!"); } } }}int main(){ printf("我是進程二。\n\n"); hPipe = CreateNamedPipe( "\\\\.\\pipe\\test2", PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, 3, 512, 512, 0, NULL); hInput = CreateThread(NULL, 0, mThreadFunc, NULL, 0, NULL); CloseHandle(hInput); while (!isExit) { fConnected = ConnectNamedPipe(hPipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED); if (fConnected) { ReadFile(hPipe, readBuffer, 256, 0, NULL); printf("進程一: %s\n", readBuffer); WriteFile(hPipe, "進程二: 我收到了!", 256, 0, NULL); DisconnectNamedPipe(hPipe); if (strcmp(readBuffer, "end") == 0) { isExit = true; } } } CloseHandle(hPipe); return 0;}2.c
C winapi 處理序間通訊(Named Pipe)。