• 【IPC进程间通讯之中的一个】邮槽MailSlot


    IPC进程间通信+邮槽MailSlot

          
            IPC(Inter-Process Communication。进程间通信)。
           现代计算机採用虚拟内存机制,为进程提供独立的足够大的地址空间。处于安全目的,一个进程不具有特殊的权限。是无法訪问还有一个进程的内存空间,进程间相互隔绝。进程间通信IPC就须要特别的机制来实现。邮槽MailSlot是经常使用的IPC方法之中的一个。

            
           1.邮槽(MailSlot):
            
           邮槽MailSlot通信的进程分为服务端client。服务端创建MailSlot,创建时指定邮槽名,client同过邮槽名打开MailSlot。
           邮槽是单向的,服务端仅仅能读取MailSlot,client仅仅能写入MailSlot。服务端读取数据是先入先出,即先写入的数据先被读取。


            2.邮槽命名 :
            本机上格式:\.mailslot[path]name
            如:\.mailslotmy_mailslot

           3.基本API函数
    创建邮槽
            HANDLE  CreateMailSlot(
                              LPCTSTR  lpName,
                              DWORD     nMaxMessageSize,
                              DWORD     lReadTimeout,
                              LPSECURITY_ATTRIBUTES   lpSecurityAttributes );
            第一个參数:邮槽名。
            第二个參数:最大消息长度。
            第三个參数:读取超时,设为0时。没有消息马上返回。MAILSLOT_WAIT_FORVER时,一直等待消息。
            第三个參数:安全属性,一般设为NULL。

            该函数创建一个Mailslot。并返回该邮槽的句柄。

    读取邮槽:       
            BOOL ReadFile(
                       
    HANDLE    hFile,
                        LPVOID     lpBuffer,
                        DWORD    nNumberOfBytesToRead,
                        LPDOWRD    lpNumberOfBytesRead,
                        LPOVERLAPPED   lpOverlapped
    )。
            第一个參数:邮槽句柄。
            第二个參数:缓存地址。

            第三个參数:消息的长度。

            第四个參数:实际读取的长度。
            第五个參数:一般设置为NULL。
            该函数用于读取邮槽内数据。
    打开邮槽:
            BOOL  CreateFile(
                         LPCTSTR   lpFileName,
                         DWORD     dwDesiredAccess,
                         DWORD     dwShareMode,
                         LPSECURITY_ATTRIBUTES   lpSecurityAttributes,
                         DWORD    dwCreationDisposition,
                         DWORD    dwFlagsAndAttributes,
                        HANDLE    hTemplateFile
    );
             第一个參数:文件指针。
             第二个參数:訪问模式。
             第三个參数:共享模式。

             第四个參数:安全属性指针。
             第五个參数:创建选项。
             第六个參数:文件属性。
             第七个參数:用于拷贝文件句柄。
             该函数用于client打开Mailslot。
    写入邮槽:
            BOOL  WriteFile(
                         HANDLE    hFile,
                         LPCVOID   lpBuffer,
                         DWORD     nNumberOfBytesToWrite,
                         LPDWORD   lpNumberOfBytesWritten,
                         LPOVERLAPPED    lpOverlapped
    );
             第一个參数:文件句柄。
             第二个參数:数据缓冲区指针。
             第三个參数:写入字节数。
             第四个參数:返回实际写入字节数。
             第五个參数:结构体指针。一般置NULL。

             该函数用于client向Mailslot写入数据。


             4.牛刀小试 : 
             先在VC6.0中执行服务端程序,在执行client程序

            执行效果

    Mailslot服务端:
    #include 
    #include 
    /* 全局变量 */
    HANDLE hSlot;
    //邮槽名
    LPTSTR lpszSlotName = TEXT("\\.\mailslot\sample_mailslot");
    void main()
    { 
    	DWORD  cbRead; 
    	char lpszBuffer[256]=" ";  
    	
        //创建邮槽
    	hSlot = CreateMailslot(
    		lpszSlotName,		        // mailslot 名
    		0,							// 不限制消息大小 
    		MAILSLOT_WAIT_FOREVER,      // 无超时 
    		(LPSECURITY_ATTRIBUTES) NULL); 
    	printf("Mailslot 创建成功!
    ");
    
    	while(1)
    	{
    
    			// 读取消息
    			ReadFile(hSlot,	    // mailslot句柄
    	        lpszBuffer,			// 缓存
    			256,			    // 消息的长度
    			&cbRead,			// 实际读取的长度
    			NULL); 
    
    			// 显示
    			printf("Data from the mailslot: %s
    ", lpszBuffer); 
    
    	}
    	return ; 
    }
    
    Mailslotclient:
    #include 
    #include 
    /* 全局变量 */
    HANDLE hSlot;
    LPTSTR lpszSlotName = TEXT("\\.\mailslot\sample_mailslot");		// mailslot名
    void main()
    { 
    	HANDLE hFile; 
    	DWORD cbWritten; 
        char *send_data="I from client!";
    
    	// 打开mailslot
    	hFile = CreateFile(lpszSlotName, 
    		GENERIC_WRITE,		// 可写
    		FILE_SHARE_READ,
    		(LPSECURITY_ATTRIBUTES) NULL, 
    		OPEN_EXISTING,		// 打开一个已经存在的mailslot,应该由服务端已经创建
    		FILE_ATTRIBUTE_NORMAL, 
    		(HANDLE) NULL); 
    
    
    	// 向mailslot写入
    	WriteFile(hFile, 
    		send_data, 
    		(DWORD) (lstrlen(send_data)+1)*sizeof(TCHAR),  
    		&cbWritten, 
    		(LPOVERLAPPED) NULL); 
    
    
    	// 结束
    	printf("Data written:%s
    ",send_data); 
    	CloseHandle(hFile); 
    	return ;
    }
    


  • 相关阅读:
    使用Python的Mock库进行PySpark单元测试
    库龄报表的相关知识
    使用PlanViz进行ABAP CDS性能分析
    Spark SQL中列转行(UNPIVOT)的两种方法
    Spark中的一些概念
    使用Visual Studio Code进行ABAP开发
    2019年的几个目标
    Dom--样式操作
    Dom选择器--内容文本操作
    Javascript面向
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10701336.html
  • Copyright © 2020-2023  润新知