c++ 进程间通信(管道和共享内存分别写),给个简单代码,包注释

我有更好的答案
推荐于2017-11-26 07:00:40 最佳答案
#include <stdio.h>
#include <windows.h>
int main(int argc, char* argv[])
{
 if (argv[1] == 0) { //主进程
  HANDLE hPipeW, hPipeR; //读管道写管道
  STARTUPINFOA si;
  PROCESS_INFORMATION pi;
  char str[128];
  char param[1024];
  CreatePipe(&hPipeR, &hPipeW, NULL, 0);
  SetHandleInformation(hPipeW, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); //使进程继承句柄
  ZeroMemory(&si, sizeof(si));
  si.cb = sizeof(si);
  sprintf(param, "\"%s\" %x", argv[0], hPipeW); //传给进程参数
  if (CreateProcessA(argv[0], param, 0, 0, TRUE, 0, 0, 0, &si, &pi) != FALSE) {
   char* pstr = str;
   CloseHandle(hPipeW); //关闭管道输入端已经由进程使用输入端
   CloseHandle(pi.hProcess);
   CloseHandle(pi.hThread);
   for(;;) {
    DWORD r;
    ReadFile(hPipeR, pstr, 128, &r, 0); //管道读取数据
    if (r > 0)
     pstr += r;
    else
     break;
   }
   CloseHandle(hPipeR);
   puts(str);
  }
  return 0;
 } else { //进程
  char str[] = "Hello!";
  HANDLE hPipeW;
  DWORD r;
  sscanf(argv[1], "%x", &hPipeW); //参数获取管道写句柄
  WriteFile(hPipeW, str, sizeof(str), &r, 0); //往管道写入数据
  CloseHandle(hPipeW);
  return 0;
 }




#include <stdio.h>
#include <string.h>
#include <windows.h>
int main(int argc, char* argv[])
{
 if (argv[1] == 0) { //主进程运行
  HANDLE hShmem;
  char param[1024];
  STARTUPINFOA si;
  PROCESS_INFORMATION pi;
  char* pstr;
  hShmem = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, 256, 0); //创建共享内存
  SetHandleInformation(hShmem, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); //使句柄继承进程
  
  sprintf(param, "\"%s\" %x", argv[0], hShmem);
  ZeroMemory(&si, sizeof(si));
  si.cb = sizeof(si);
  CreateProcessA(argv[0], param, 0, 0, TRUE, 0, 0, 0, &si, &pi);
  WaitForSingleObject(pi.hProcess, INFINITE); //等待进程运行结束
  pstr = (char*) MapViewOfFile(hShmem, FILE_MAP_WRITE, 0, 0, 0); //共享内存内存块映射前进程
  puts(pstr);
  UnmapViewOfFile(pstr);
  CloseHandle(hShmem);
  return 0;
 } else { //进程运行
  HANDLE hShmem;
  char* pstr;
  sscanf(argv[1], "%x", &hShmem);
  pstr = (char*) MapViewOfFile(hShmem, FILE_MAP_WRITE, 0, 0, 0); //共享内存象映射前进程
  strcpy(pstr, "Hello~!"); //往共享内存写入字符串
  UnmapViewOfFile(hShmem);
  CloseHandle(hShmem);
  
  return 0;
 }
}

空雪梦见

采纳率:78% 来自团队:快乐之家 擅长: C/C++ C#/.NET VC++

为您推荐:

×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消