进程间通信——匿名管道
生活随笔
收集整理的這篇文章主要介紹了
进程间通信——匿名管道
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用匿名管道做進程通信,需要用父進程創建一個子進程,該子進程的標準輸入輸出句柄由父進程指定。
無論父進程還是子進程,都可以收發數據,這里僅演示父進程發數據,子進程打印數據。
父進程循環從控制臺讀數據,并發送給子進程,子進程用對話框打印數據,約定子進程收到"quit"后退出。
父進程(發送端)
#define _CRT_SECURE_NO_WARNINGS #include <Windows.h> #include <stdio.h>HANDLE g_hRead, g_hWrite;BOOL CreateChildProcess() {// 創建可繼承的匿名管道,可以理解成輸入輸出設備 SECURITY_ATTRIBUTES sa;sa.bInheritHandle = TRUE;sa.lpSecurityDescriptor = NULL;sa.nLength = sizeof(SECURITY_ATTRIBUTES);if (!CreatePipe(&g_hRead, &g_hWrite, &sa, 0)){printf("創建匿名管道失敗\n");return FALSE;}// 創建子進程,設置標準輸入輸出設備STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(STARTUPINFO));si.cb = sizeof(STARTUPINFO);si.dwFlags = STARTF_USESTDHANDLES;si.hStdInput = g_hRead;si.hStdOutput = g_hWrite;si.hStdError = GetStdHandle(STD_ERROR_HANDLE);if (FALSE == CreateProcess(TEXT("C:\\Users\\gsy\\source\\repos\\2020年暑假學習\\Debug\\匿名管道-接收端.exe"), NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)){//printf("創建進程失敗\n");CloseHandle(g_hRead);CloseHandle(g_hWrite);g_hRead = g_hWrite = NULL;return FALSE;}else{CloseHandle(pi.hProcess);CloseHandle(pi.hThread);}return TRUE; }void SendData() {char szBuffer[0x100];scanf("%s", szBuffer);DWORD dwWrite = 0;if (!WriteFile(g_hWrite, szBuffer, strlen(szBuffer) + 1, &dwWrite, NULL)){printf("寫數據失敗\n");} }int main() {if (CreateChildProcess()){printf("創建子進程成功,輸入要發送的數據,輸入quit殺死子進程\n");}else{printf("創建子進程失敗\n");}while (true){SendData();}return 0; }子進程(接收端)
#include <windows.h> #include <stdio.h>int main() {HANDLE hRead = GetStdHandle(STD_INPUT_HANDLE);HANDLE hWrite = GetStdHandle(STD_OUTPUT_HANDLE);char szBuffer[0x100];DWORD dwRead = 0;while (true){ReadFile(hRead, szBuffer, 0x100, &dwRead, NULL);if (strcmp(szBuffer, "quit") == 0){printf("quit!\n");break;}printf("%s\n", szBuffer);MessageBoxA(0, szBuffer, "子進程接收到的數據", MB_OK);}return 0; }運行結果(運行父進程程序)
總結
以上是生活随笔為你收集整理的进程间通信——匿名管道的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进程间通信——共享内存(CreateFi
- 下一篇: 进程间通信——命名管道