`
hcmfys
  • 浏览: 347194 次
  • 性别: 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);   --------------------------------------------(完)

分享到:
评论

相关推荐

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

    卷2:进程间通信(第2版)》是一部UNIX网络编程的经典之作!进程间通信(IPC)几乎是所有Unix程序性能的关键,理解IPC也是理解如何开发不同主机间网络应用程序的必要条件。《UNIX网络编程.卷2:进程间通信(第2版)》从对...

    linux进程间通信与同步.pdf

    Linux系统中的进程间通信是典型的虚拟内存系统中的进程间通信:Linux 的进程间通信是不同进程间交换数据的机制。由于Linux系统支持虚拟内 存, 对于每一个进程,系统会为它分配一个单独的进程空间,不同的进程有不同...

    进程间通信

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

    C# 进程间通信 共享内存

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

    进程间通信之消息队列 ( message queue )——完整代码

    进程间通信之消息队列 ( message queue ) 消息队列是消息的链表,具有特定的格式,并由消息队列标识符标识. 七种进程间通信方式: 一.无名管道( pipe ) 二.有名管道( fifo ) 三.共享内存 ( shared memory ) 四....

    Linux进程间通讯视频教程

    Linux进程间通讯视频教程,包括6个视频教程,非常实用,适合初学者!

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

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

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

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

    C#进程间通信

    操作系统实验之进程间通信(管道方式)。 内涵实验源码及报告文档。 更详尽内容请参考小魏博客:http://blog.csdn.net/xiaowei_cqu/article/details/7041212

    进程间通信之信号 sinal ) 完整代码

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

    QT之进程和进程间通信(IPC)

    进程是操作系统的基础之一。一个进程可以认为是一个正在执行的程序。...这个类可以允许我们的应用程序开启一个新的外部程序,并且与这个程序进行通讯。下面我们用一个非常简单的例子开始我们本章有关进程的阐述。

    Messenger进程间通信

    Messenger进程间通信,包括Service服务端代码和客户端代码;进程内部通信/进程间通信并且应答;

    Qt进程间通信与同步示例

    Qt进程间通信与同步示例,通过QFile内存映射文件来共享内存达到进程间通信的效果。同时利用QSystemSemaphore 来实现进程同步

    UNIX网络编程第二卷 进程间通信

    UNIX网络编程第二卷 进程间通信

    操作系统进程间通信实验

    通过对进程间通信同步/互斥问题的编程实现,加深理解信号量和 P、V 操作的原理; 对 Windows 或 Linux 涉及的几种互斥、同步机制有更进一步的了解;熟悉 Windows 或 Linux 中定义的与互斥、同步有关的函数。

    C# 使用管道Pipe在进程间通信

    进程间通信的一种方式,Pipes:管道,分为无名管道:在父子进程间交换数据;有名管道:可在不同主机间交换数据,分为服务器方和客户方,在Win9X下只支持有名管道客户。 1、进程间通信 2、管道Pipe通信

    C# 进程间通信 Windows消息通讯,SendMessage

    Windows进程之间是相互独立的,通过Windows消息机制,我们可以在进程之间进行通信,适合一台电脑的windows平台下进行消息交换,该例是两个winform之间通过...1、进程间通信 2、SendMessage 3、窗体间通信,接收发送消息

    进程间通信之套接字( socket )——完整代码

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

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

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

    Linux进程间通信

    Linux进程间通信

Global site tag (gtag.js) - Google Analytics