`
hcmfys
  • 浏览: 356279 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

进程间通讯

阅读更多

  一种机制,操作系统进程和线程通过它交换数据和消息。IPC 包括本地机制(如 Windows 共享内存)或网络机制(如 Windows 套接字)。 

 进程间通讯  一、说明进程间通讯的必要性及困难性  

二、Socket的方法,对于不同机器上且数据量很的情况会有很大的帮助,但对于同一台机器之间的不同进程之间的通讯就不方便了 (代码量太多)  

 三、进程间通讯的剪切板方法 

 a、对于发送端: 

 CString str;   GetDlgItemText(IDC_EDIT1,str);  

 HANDLE hGlobal;  

 if(this->OpenClipboard())//获取剪切板的资源所有权 

 {  

 EmptyClipboard();//将剪切板的内容清空

  hGlobal=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);//在堆上分配一块用于存放数据的空间,程序返回一个内存句柄 

 char* pBuf=(char*)GlobalLock(hGlobal);//将内存块句柄转化成一个指针,并将相应的引用计数器加一

  strcpy(pBuf,str.GetBuffer(str.GetLength()));//将字符串拷入指定的内存块中

  GlobalUnlock(hGlobal);//将引用计数器数字减一 

 ::SetClipboardData(CF_TEXT,hGlobal);//将存放有数据的内存块放入剪切板的资源管理中  ::CloseClipboard();//释放剪切板的资源占用权 

 }   

b、对于客户端 

 if(this->OpenClipboard())//获取剪切板的资源所有权 

 {   HANDLE hGlobal=::GetClipboardData(CF_TEXT);从剪切板中取出一个内存的句柄  

char* pBuf=(char*)GlobalLock(hGlobal);//将内存句柄值转化为一个指针,并将内存块的引用计数器加一  SetDlgItemText(IDC_EDIT2,pBuf);  

 GlobalUnlock(hGlobal);//将内存块的引用计数器减一 

 CloseClipboard();//释放剪切板资源的占用权 

 }

  四、内存映射文件方法 

 1、 服务器端代码: 

 HANDLE hMapFile;  

 hMapFile= CreateFileMapping(NULL,NULL,PAGE_READWRITE,0,10,"YuanMap");

  if (hMapFile == NULL)   {  

 AfxMessageBox("CreateFileMapping出错!");  

 return;   }   

LPVOID pFile;  

 pFile= MapViewOfFile(hMapFile,FILE_MAP_WRITE|FILE_MAP_READ,0,0,0);   

if (pFile == NULL)   

{  

 AfxMessageBox("MapViewOfFile出错!");

  return;   

}   

CString str;   GetDlgItemText(IDC_EDIT1,str);   strcpy((char*)pFile,str.GetBuffer(str.GetLength()));   //CloseHandle(hMapFile); //不能加,否则客户端收不到,所以一般会将这个句柄作为一个全局变量  2、 客户机端代码:  HANDLE hMap;   hMap= OpenFileMapping(FILE_MAP_READ|FILE_MAP_WRITE,   TRUE,   "YuanMap");   LPVOID pVoid;   pVoid=::MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);   CString str=(char*)pVoid;   SetDlgItemText(IDC_EDIT1,str);   UnmapViewOfFile(pVoid);   CloseHandle(hMap);  

 五、进程间通讯的邮槽方法  

1、 邮槽采用的是一种广播机制。  

2、 邮槽采用的是一种直接基于文件系统开发而成,所以它不依赖于某种具体的网络协议。 

 3、 邮槽每次传送的消息长度不能长于422字节。 

 4、 发送端代码如下:(客户端)   HANDLE hslot;

  hslot=CreateFile("\\\\.\\mailslot\\myslot",GENERIC_WRITE,   FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,   NULL);  

 if(!hslot)   {  

 

MessageBox("打开邮槽失败!");  

 return;   }  

 char *pBuf="专业的编程语言培训";  

 DWORD dwWrite;  

 WriteFile(hslot,pBuf,strlen(pBuf)+1,&dwWrite,NULL);

  CloseHandle(hslot);   

5、 接收端代码如下:(服务器端) 

 HANDLE hMail;

  hMail=CreateMailslot("\\\\.\\mailslot\\myslot",0,   MAILSLOT_WAIT_FOREVER,NULL);  

 if(INVALID_HANDLE_VALUE==hMail)   {  

 MessageBox("创建邮槽失败!");   return;   }

  HANDLE hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

  OVERLAPPED ovlap;   

ZeroMemory(&ovlap,sizeof(ovlap));   

ovlap.hEvent=hEvent;   

char buf[200];

  DWORD dwRead;  

 if(FALSE==ReadFile(hMail,buf,200,&dwRead,&ovlap))   

{  

 if(ERROR_IO_PENDING!=GetLastError())   

{  

 MessageBox("读取操作失败!");  

 CloseHandle(hMail);  

 return;  

 }   }   WaitForSingleObject(hEvent,INFINITE);  

 MessageBox(buf);   ResetEvent(hEvent);   CloseHandle(hMail);   六、进程间通讯的命令管道方法  A、对于发送端代码如下:  HANDLE handle;   handle=CreateNamedPipe("\\\\.\\pipe\\MyPipe",   PIPE_ACCESS_DUPLEX,PIPE_TYPE_BYTE | PIPE_READMODE_BYTE,   1,0,0,1000,NULL);//创建一个命名管道连结  ConnectNamedPipe(handle,NULL);//在命名管道实例上监听客户机连结请求  char buf[200]="http://www.it315.org";   DWORD dwWrite;   WriteFile(handle,buf,strlen(buf)+1,&dwWrite,NULL);//往管道里写数据  CloseHandle(handle);//关闭管道  B、对于接收端代码如下:  HANDLE hNamedPipe;   WaitNamedPipe("\\\\.\\pipe\\MyPipe",NMPWAIT_WAIT_FOREVER);//等候一个命名管道实例可供自己使用  hNamedPipe=CreateFile("\\\\.\\pipe\\MyPipe",GENERIC_READ,FILE_SHARE_READ,   NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);//建立与命名管道的连结  char buf[200];   DWORD dwRead;   ReadFile(hNamedPipe,buf,200,&dwRead,NULL);//从命名管道中读取数据  MessageBox(buf);   CloseHandle(hNamedPipe);//关闭与命名管道服务器的连结  七、进程间通讯的匿名管道方法  父进程:  A、对于父进程中创建一个管道代码如下:  SECURITY_ATTRIBUTES sa;   sa.nLength=sizeof(sa);   sa.bInheritHandle=TRUE;   sa.lpSecurityDescriptor=NULL;   if(FALSE==CreatePipe(&hRead,&hWrite,&sa,0))//创建一个匿名的管道,得到一个用于从管道读取的句柄,一个用于向管道写数据用的句柄  {   MessageBox("Create pipe failed!");   return;   }   STARTUPINFO sui;   ZeroMemory(&sui,sizeof(sui));   sui.cb=sizeof(sui);   sui.dwFlags=STARTF_USESTDHANDLES;   sui.hStdInput=hRead;   sui.hStdOutput=hWrite;   sui.hStdError=GetStdHandle(STD_ERROR_HANDLE);   PROCESS_INFORMATION pi;   CreateProcess("..\\PipeCli\\Debug\\PipeCli.exe",NULL,   NULL,NULL,TRUE,CREATE_DEFAULT_ERROR_MODE,/*0*/   NULL,NULL,&sui,&pi);//创建一个新的子进程,并将准备好的句柄信息传给子进程  CloseHandle(pi.hProcess);   CloseHandle(pi.hThread);   B、父进程中从管道读取代码如下:  char buf[200];   DWORD dwRead;   ReadFile(hRead,buf,200,&dwRead,NULL);   MessageBox(buf);   C、父进程中往管道写入代码如下:  char buf[200]="专业的编程语言培训";   DWORD dwWrite;   WriteFile(hWrite,buf,strlen(buf)+1,&dwWrite,NULL);   子进程:  首先得到用于管道读取与写入用的句柄值(最好是放在视图的初始化更新函数里)   hRead=GetStdHandle(STD_INPUT_HANDLE);   hWrite=GetStdHandle(STD_OUTPUT_HANDLE);   读取部分代码:  char buf[200];   DWORD dwRead;   ReadFile(hRead,buf,200,&dwRead,NULL);   MessageBox(buf);   写入部分代码:  char buf[200]="http://www.it315.org";   DWORD dwWrite;   WriteFile(hWrite,buf,strlen(buf)+1,&dwWrite,NULL);   --------------------------------------------(完)

分享到:
评论

相关推荐

    Linux进程间通讯视频教程

    在本"Linux进程间通讯视频教程"中,你将学习如何创建和管理这些通信机制,包括如何设置、使用以及避免潜在的问题。对于初学者而言,理解这些基本概念和操作是至关重要的,因为它们是构建复杂、并发系统的基础。通过...

    UNIX网络编程_卷2_进程间通信

    本书详细介绍了UNIX系统中进程间通信(IPC)的各种形式,这些通信机制对于提高UNIX程序性能至关重要,同时是开发不同主机间网络应用程序的基础。 书中首先从Posix IPC和System V IPC的内部结构开始讨论。Posix IPC...

    linux无亲缘关系进程间通信(互斥锁+条件变量+共享内存)

    在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)是多个进程之间交换数据的重要手段。本示例中提到的“linux无亲缘关系进程间通信”着重讲解了如何利用互斥锁(Mutex)、条件变量(Condition ...

    进程间通信

    七种进程间通信方式: 一.无名管道( pipe ) 二.有名管道( fifo ) 三.共享内存 ( shared memory ) 四.信号 ( sinal ) 五.消息队列 ( message queue ) 六.信号量 ( semophore ) 七.套接字 ( socket ) 进程间通信...

    linux进程间通信与同步.pdf

    ### Linux进程间通信与同步详解 #### 一、概述 在多任务操作系统中,进程间通信与同步机制是解决进程间数据交换与资源共享的关键技术。这些机制确保了多个并发运行的任务能够有效地协作,并且避免了资源冲突。对于...

    跨平台进程间通信源码

    跨平台进程间通信(IPC,Inter-Process Communication)是计算机技术中的一个重要概念,它允许不同进程之间共享数据、协调工作,实现系统资源的有效利用。在标题中提到的“跨平台进程间通信源码”可能是一个软件库...

    VC+C# 实现的进程间通讯

    进程间通信(IPC,Inter-...总之,“VC+C# 实现的进程间通讯”项目展示了如何在Windows环境下利用共享内存和消息传递进行进程间的有效通信。理解并应用这些技术对于任何涉及多进程协作的软件开发都具有很高的价值。

    C#进程间通讯

    在“C#进程间通讯”主题下,我们可以深入探讨以下知识点: 1. MSMQ的原理与配置:包括消息队列的创建、消息的发送与接收,以及如何处理消息的持久化和安全性。 2. 共享内存的创建与访问:介绍如何使用`Memory...

    c#源码 进程间通讯

    本压缩包文件“c#进程间通讯”包含了使用C# 2005实现进程间通信的源代码示例,特别关注了通过API中的`PostMessage`函数来发送消息的方式。 `PostMessage`是Windows API中的一部分,用于异步地向指定窗口发送一个...

    C#与C++进程间通信

    在IT领域,进程间通信(IPC,Inter-Process Communication)是一项关键的技术,它允许不同的进程之间交换信息,协同工作。本示例以“C#与C++进程间通信”为主题,利用命名管道(Named Pipe)作为通信媒介,实现了...

    C#实现进程间通讯(源码)

    压缩包文件"20230206 进程通讯"很可能包含了一些C#实现的进程间通信的源代码示例。这些示例可能涵盖了上述提到的几种通信方式,通过查看和学习这些源码,开发者可以更好地理解如何在实际项目中应用这些技术。 总之...

    delphi进程间通讯例子

    标题中的"Delphi进程间通讯例子"涉及到的是在Delphi编程环境中实现不同进程之间的通信技术。在计算机系统中,进程是程序的实例,每个进程都有自己的独立内存空间,因此进程间通讯(Inter-Process Communication, IPC...

    C# 进程间通信 共享内存

    共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。...1、进程间通信 2、共享内存 3、托管方式与非托管共享内存

    笔记_UNIX环境网络编程卷二进程间通信_中文第二版.pdf

    笔记_UNIX环境网络编程卷二进程间通信_中文第二版

    UNIX网络编程 第2版 第2卷 进程间通信

    《UNIX网络编程 第2版 第2卷 进程间通信》是UNIX系统下进行网络编程不可或缺的经典著作,尤其在深入理解和实践进程间通信(IPC,Inter-Process Communication)方面提供了丰富的知识和技术指导。本书详细阐述了如何...

    鸿洋Messenger进程间通讯整理

    "鸿洋Messenger进程间通讯整理"这个主题主要探讨了如何利用Android的Messenger服务进行高效的进程间通信。鸿洋,即王建辉,是知名Android开发者,他在CSDN博客上分享了一篇文章,详细解析了这一技术。 Messenger是...

    UNIX网络编程 卷2:进程间通信 随书源代码

    linux/UNIX网络编程 进程间通信 随书源代码 IPC 值得学习的好东西!

    linux 操作系统进程间通信 ppt

    Linux 操作系统进程间通信 Linux 操作系统的进程间通信是指在多个进程之间实现信息交换和协作的机制。进程间通信是操作系统中非常重要的一部分,涉及到进程之间的信息交换、同步和互斥等问题。 在 Linux 操作系统...

    VS2008代码式例:进程间通信,本人亲测OK

    在编程领域,进程间通信(IPC,Inter-Process Communication)是一项关键的技术,它允许不同的进程之间交换数据和信号,以实现协同工作。本示例基于Visual Studio 2008(VS2008),提供了关于如何进行进程间通信的...

    操作系统实验报告(LINUX进程间通信)

    操作系统实验报告(LINUX进程间通信) 操作系统实验报告(LINUX进程间通信)是操作系统课程的一部分,涵盖了Linux进程间通信的原理和应用,包括消息队列、C/S结构等内容。下面将对这些知识点进行详细的解释。 一、...

Global site tag (gtag.js) - Google Analytics