四种进程间通信方式简介与比较

CreatePipe(&m_hRead, &m_hWrite, &sa, 0)创建匿名管道
CreateProcess("..//Child//debug//Child.exe", NULL, NULL, NULL,TRUE,
        0, NULL, NULL, &sui, &pi)通过STARTUPINFO结构体sui将父进程匿名管道读写句柄传递给子进程 sui.hStdInput = m_hRead;
    sui.hStdOutput = m_hWrite;
同样,通过ReadFile和WriteFile从管道中读取、写入数据

命名管道
服务器端:
hPipe=CreateNamedPipe(".//pipe//MyPipe",
        PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
        0,1,1024,1024,0,NULL); //创建命名管道
HANDLE hEvent;
    hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
    OVERLAPPED ovlap;
    ZeroMemory(&ovlap,sizeof(OVERLAPPED));
    ovlap.hEvent=hEvent;
ConnectNamedPipe(hPipe,&ovlap)//等待客户端连接
WaitForSingleObject(hEvent,INFINITE)//等待事件发生
然后通过readfile和writefile从管道中读取数据

客户机端:
WaitNamedPipe(".//pipe//MyPipe",NMPWAIT_WAIT_FOREVER) //连接管道
hPipe=CreateFile(".//pipe//MyPipe",GENERIC_READ | GENERIC_WRITE,
        0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);//打开已经存在的管道
然后通过readfile和writefile从管道中读取数据

油槽的服务器端只能接收数据,客户端只能发送数据,由于其基于广播通信体系,所以可以利用油槽,编码多个服务器端和一个客户端来简单实现一个一对多的网络系统。
服务器端:
    HANDLE hMailslot = CreateMailslot(".//mailslot//MyMailslot", 0,
        MAILSLOT_WAIT_FOREVER, NULL);  //创建油槽
ReadFile(hMailslot, buf, 100, &dwRead, NULL)  //读取数据
客户端:
hMailslot = CreateFile(".//mailslot//MyMailslot", GENERIC_WRITE, FILE_SHARE_READ,
        NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);  //打开油槽
WriteFile(hMailslot, buf, strlen(buf)+1, &dwWrite, NULL)  //写入数据

剪贴板和匿名管道只能实现同一台机器上两个进程间的通信,不能实现跨网络的通信;而命名管道和油槽则两者都可以实现,对于油槽还可以实现一对多的通信,而命名管道只能是一个点对点的通信。但是油槽发送信息较少,要在424字节以下。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值