进程间通信详解 - 邮槽实现

【IPC进程间通讯之一】邮槽MailSlot IPC进程间通信+邮槽MailSlot                IPC(Inter-Process Communication,进程间通信)。        现代计算机采用虚拟内存机制,为进程提供独立的足够大的地址空间,处于安全目的,一个进程不具有特殊的权限,是无法访问另一个进程的内存空间,进程间相互隔绝。进程间通信IPC就需要特别的机制来实现,邮槽MailSlot是常用的IPC方法之 阅读详情
 

引子

前面的一篇博文介绍了进程之间通信的一种最为简单的方式,

也就是在本地进程之间通过剪贴板来实现进程间通信,而剪贴板自有其缺陷,

很显然的是,剪贴板只能在本地机器上实现,

无法实现本地进程与远程服务器上的进程之间的通信,

那么有没有办法实现本地进程和远程进程的通信呢?

办法自然是有的,要是实在搞不出,

我拿 Socket 来实现本地进程和远程进程的通信来实现也是可以的,

但是你想啊,要用 Socket 来实现本地进程和远程进程之间的通信,

那不仅我要在本地进程中加一堆的 Socket 代码,

并且服务器上的进程中也是需要加一堆的 Socket 代码的,

那不搞死人去,也太麻烦了吧,所以不行不行,得换一种方案。

下面就来介绍一种超级无敌简单的方案,其可以用来实现本地进程与远程进程之间的通信,

那就是通过邮槽来实现。

           

            

邮槽定义

邮槽(Mailslot)也称为邮件槽,其是 Windows 提供的一种用来实现进程间通信的手段,

其提供的是基于不可靠的,并且是单向数据传输的服务。

邮件槽只支持单向数据传输,也就是服务器只能接收数据,而客户端只能发送数据,

何为服务端?何为客户端?

服务端就是创建邮槽的那一端,而客户端就是已存在的邮件槽的那一端。

还有需要提及的一点是,客户端在使用邮槽发送数据的时候只有当数据的长度 < 425 字节时,

才可以被广播给多个服务器,如果消息的长度 > 425 字节的话,那么在这种情形下,

邮槽是不支持广播通信的。

              

          

邮槽的实现

首先是服务端调用 CreateMailslot 函数,这个函数会将创建邮件槽的请求传递给内核的系统服务,

也就是 NtCreateMailslot 函数,而 NtCreateMailslotFile 这个函数会到达底层的邮槽驱动程序,

也就是 msfs.sys ,然后一些创建邮槽的工作就交给邮槽驱动程序来完成了,对于底层驱动,这里不作介绍,

而在高层,我们也就只需要调用 CreateMailslot 函数就可以实现创建邮槽了。

            

             

邮槽的创建

下面我们就来看看这个 CreateMailslot 函数了:

该函数利用指定的名称来创建一个邮槽,然后返回所创建的邮槽的句柄。

HANDLE    WINAPI   CreateMailslot(
        __in          LPCTSTR lpName,
        __in          DWORD nMaxMessageSize,
        __in          DWORD lReadTimeout,
        __in_opt      LPSECURITY_ATTRIBUTES lpSecurityAttributes
);

参数 lpName 指定了将要创建的邮槽的名称,该名称的格式必须为 \\.\mailslot\MailslotName。

在这里需要注意的是两个斜杠后的那个 “.”,在这里使用圆点代表的是本地机器,

参数 nMaxMessageSize 用来指定可以被写入到邮槽的单一消息的最大尺寸,

为了可以发送任意大小的消息,需要将该参数设置为 0 。

参数 lReadTimeOut 指定读取操作的超时时间间隔,以毫秒作为单位。

读取操作在超时之前可以等待一个消息被写入到邮槽中,如果将这个值设置为 0 ,那么若没有消息可用的话,该函数将立即返回。

如果将该值设置为 MAILSLOT_WAIT_FOREVER,则该函数会一直等待,直到有消息可用。

参数 lpSecurityAttributes 一般设置为 NULL 即可,即采用 Windows 默认的针对于邮槽的安全性。

                       

              

示例:邮槽实现进程间通信

服务端实现:(简单 MFC 程序)

项目结构:

image

消息以及成员函数和成员变量的声明:

// 实现
protected:
    HICON m_hIcon;
 
    // 生成的消息映射函数
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnBnClickedBtnExit();
    afx_msg void OnBnClickedBtnRecv();
    afx_msg void OnBnClickedBtnCreate();
 
    //定义一个用来创建线程的成员函数
    HANDLE    CreateRecvThread(LPVOID lpParameter, DWORD threadFlag, LPDWORD lpThreadID);
 
    //控件变量:用来接收用户输入的数据
    CEdit m_RecvEdit;
 
    //成员变量:用来保存创建的邮件槽句柄
    HANDLE m_hMailslot;

消息映射表定义:

//用来定义邮槽发送和接收的最大数据字节数
const int        maxDataLen = 424;
 
//用来接收由客户端发送过来的数据
char *            pStrRecvData;
 
CMailSlotServerDlg::CMailSlotServerDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CMailSlotServerDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    
 
    m_hMailslot = NULL;
 
    //给用来接收数据的指针变量分配内存并清为 0
    pStrRecvData = new char[maxDataLen];
    memset(pStrRecvData, 0, maxDataLen);
}
 
void CMailSlotServerDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_EDIT_MAILSLOT, m_RecvEdit);
}
 
BEGIN_MESSAGE_MAP(CMailSlotServerDlg, CDialogEx)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(ID_BTN_EXIT, &CMailSlotServerDlg::OnBnClickedBtnExit)
    ON_BN_CLICKED(ID_BTN_RECV, &CMailSlotServerDlg::OnBnClickedBtnRecv)
    ON_BN_CLICKED(ID_BTN_CREATE, &CMailSlotServerDlg::OnBnClickedBtnCreate)
END_MESSAGE_MAP()

消息处理函数:

//退出按钮的消息处理例程
void CMailSlotServerDlg::OnBnClickedBtnExit()
{
    CDialogEx::OnOK();
}
 
//创建按钮的消息处理
void CMailSlotServerDlg::OnBnClickedBtnCreate()
{
    //创建名为 ZacharyMailSlot 的邮槽
    this->m_hMailslot = CreateMailslot(TEXT("\\\\.\\mailslot\\ZacharyMailSlot"), 0, 
        MAILSLOT_WAIT_FOREVER, NULL);
 
    if(INVALID_HANDLE_VALUE == this->m_hMailslot)
    {
        MessageBox(TEXT("创建邮槽失败 ..."), TEXT("提示"), MB_ICONERROR);
        return;
    }
}
 
//接收按钮的消息处理
void CMailSlotServerDlg::OnBnClickedBtnRecv()
{
    CString                cStrRecvData;
    DWORD                dwRead;
 
    //创建接收数据的线程,将邮槽句柄传递给线程
    CreateRecvThread((LPVOID)this->m_hMailslot, 0, NULL);
 
    cStrRecvData = pStrRecvData;
 
    this->m_RecvEdit.SetWindowText(cStrRecvData);
 
    UpdateData(FALSE);
}
 
//线程处理函数
DWORD WINAPI RecvThreadProc(LPVOID lpPrameter)
{
    HANDLE                hRecvMailSlot;
    DWORD                dwRead;
 
    hRecvMailSlot = (HANDLE)lpPrameter;
 
    //利用传进来的邮槽句柄接收收据,并将数据存放到 pStrRecvData 中
    if(!ReadFile(hRecvMailSlot, pStrRecvData, maxDataLen, &dwRead, NULL))
    {
        return NULL;
    }
 
    //关闭邮槽
    CloseHandle(hRecvMailSlot);
 
    return NULL;
}
 
HANDLE CMailSlotServerDlg::CreateRecvThread(LPVOID lpParameter, DWORD threadFlag, LPDWORD lpThreadID)
{
    //创建一个线程
    return CreateThread(NULL, 0, RecvThreadProc, lpParameter, threadFlag, lpThreadID);
}

客户端实现:(简单 MFC 程序)

项目结构:

image

消息以及成员函数和成员变量的声明:

// 实现
protected:
    HICON m_hIcon;
 
    // 生成的消息映射函数
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnBnClickedBtnExit();
    afx_msg void OnBnClickedBtnSend();
    CEdit m_SendEdit;

消息映射表定义:

const int maxDataLen = 424;

CMailSlotClientDlg::CMailSlotClientDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CMailSlotClientDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMailSlotClientDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_EDIT_SEND, m_SendEdit);
}

BEGIN_MESSAGE_MAP(CMailSlotClientDlg, CDialogEx)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(ID_BTN_EXIT, &CMailSlotClientDlg::OnBnClickedBtnExit)
    ON_BN_CLICKED(ID_BTN_SEND, &CMailSlotClientDlg::OnBnClickedBtnSend)
END_MESSAGE_MAP()

消息处理函数:

//退出按钮的消息处理例程
void CMailSlotClientDlg::OnBnClickedBtnExit()
{
    CDialogEx::OnOK();
}
 
 
//发送数据的消息处理例程
void CMailSlotClientDlg::OnBnClickedBtnSend()
{
    UpdateData();
 
    if(this->m_SendEdit.GetWindowTextLength() > 0 && 
       this->m_SendEdit.GetWindowTextLength() < maxDataLen)
    {
        HANDLE                hSendMailSlot;
        CString                cStrSendData;
        DWORD                dwWrite;
        char *                pSendBuf;
 
        //打开由服务端创建的邮件槽
        hSendMailSlot = CreateFile(TEXT("\\\\.\\mailslot\\ZacharyMailSlot"), 
            GENERIC_WRITE, FILE_SHARE_READ, NULL, 
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
 
        if(INVALID_HANDLE_VALUE == hSendMailSlot)
        {
            MessageBox(TEXT("打开邮槽失败 ..."), TEXT("提示"), MB_ICONERROR);
            return;
        }
 
        this->m_SendEdit.GetWindowText(cStrSendData);
 
        //需要将 Unicode 字符转换为 ASCII 字符发送
        pSendBuf = new char[cStrSendData.GetLength() + 1];
        memset(pSendBuf, 0, sizeof(cStrSendData.GetLength() + 1));
        for(int i=0;i<cStrSendData.GetLength();i++)
        {
            pSendBuf[i] = cStrSendData.GetAt(i);
        }
 
        //通过邮件槽向服务端发送数据
        if(!WriteFile(hSendMailSlot, pSendBuf, cStrSendData.GetLength(), &dwWrite, NULL))
        {
            MessageBox(TEXT("写入数据失败 ..."), TEXT("提示"), MB_ICONERROR);
 
            CloseHandle(hSendMailSlot);
            return;
        }
        MessageBox(TEXT("写入数据成功 ..."), TEXT("提示"), MB_ICONINFORMATION);
    }
}

效果展示:

首先启动服务端进程并单击创建按钮:

image

然后启动客户端进程,并在客户端程序文本框中输入数据,然后单击发送按钮:

image

然后回到服务端程序中,并且单击接收按钮:

image

从上面的截图中可以看出,通过邮槽确实实现了从客户端进程向服务端进程发送数据。

当然上面的 Demo 中的服务端和客户端都是在本地机器上实现的,

如果想要实现本地进程和远程进程通信的话,

只需在客户端调用 CreateFile 打开邮槽时,将下面截图中标记的圆点置换为远程服务器的名称即可以实现了。

image

           

          

结束语

对于邮槽呢,其实还是蛮简单的,

在服务端的话,也就只需要在服务端调用 CreateMailslot 创建一个邮槽,

然后再在服务端调用 ReadFile 来等待读取数据即可以了,

而在客户端的话,也就只需要调用 CreateFile 来打开一个已经在服务端创建好的邮槽,

然后再调用 WriteFile 往这个邮槽中写入数据就可以了。

也就是说,对于邮槽的话,也就那么点东西需要介绍,

但是通过前面的介绍我们也很容易知道,对于通过利用邮槽来实现本地进程和远程进程的通信还是有缺陷的,

缺陷就是对于邮槽来说,服务端只能接收来自客户端的数据,而不能给客户端发送数据,

而客户端的话,则只能给服务端发送数据,而不能接收服务端发送过来的数据(事实上,服务端也发送不了)。

如果要实现客户端可以发送数据给服务端,同时也能接收来自服务端的数据,

而服务端也可以发送数据给客户端,并且服务端也可以接收到来自客户端的数据的话,

那需要利用另外的进程间通信的手段了,对于这点,留到下一篇博文介绍。

Docker 环境 Playwright MCP 部署全流程指南 Docker部署Playwright MCP全流程指南 本文详细介绍了使用Docker容器化部署Playwright MCP的完整流程,涵盖镜像拉取、容器启动、配置优化和问题排查。主要内容包括: 核心部署步骤:通过官方镜像快速搭建环境,支持自定义端口和数据持久化 关键配置要点:详解网络设置、持久化目录挂载和环境变量配置 服务验证方法:通过日志检查和服务连通性测试确保部署成功 客户端集成:提供VS Code等IDE的配置示例 常见问题解决:针对浏览器启动超时、跨域限制等问题给出解决方案 实战案例:演示自动化爬 阅读详情

相关推荐

【OpenCV-Python】图像的载入、显示和输出(imread()、imshow()、waitKey()、namedWindow()、imwrite())

图像的载入:imread()函数 imread()函数可以用来非常便捷地读取文件中的图片到Opencv中。这个函数一般需要两个参数: (1)载入图片的路径名。如果图像文件在工程文件夹下,可以直接用文件名读取,如“cat.jpg”,否则需要输入完整的访问路径,如“D:\\test\\lena.png”。这里还有几个tips: imread函数中,一个点代表省略当前文件夹路径,两个点则代表回...

M&Q的博客 1397

进程通信+邮槽【C++】

进程间通信方式邮槽的简单概念

weixin_45690131的博客 472

DaVinci Configurator BswM模块配置

BswM是AUTOSAR(Automotive Open System Architecture)系统架构中的模块之一,它是基础软件模块(BSW)之一。BswM全称为Basic Software Module Manager(基础软件模块管理器),它负责管理和协调其他BSW模块的行为和交互,以实现整个系统的功能。BswM可以被看作是一个状态机,通过监控系统的状态和事件触发,来控制其他BSW模块的运行状态和互相配合,以达到整个系统的预期行为。

qq_59258431的博客 3945

Windows邮件槽(Mailslot)

Windows 邮件槽(MailSlot)来自《Windows网络编程第二版 中文版》优点:通过网络,将一条消息广播给一台或多台计算机。 缺点:只允许从客户机到服务器,建立一种不可靠的单向数据通信。不提供数据可靠性传播的保障。 邮件槽是围绕Windows文件系统接口设计出来的。客户机和服务器应用需要使用标准的Win32文件系统I/O函数,如ReadFile和WriteFil

candj的专栏 3074

PLUS模型土地利用变化模拟使用简介

因子包括自然因子如社会因子,通过计算整理得到新图层,并以tif文件输出到驱动因子的文件夹里,驱动因子文件夹里存放的是tif文件格式。线性回归使用提供的所有的LULC资源数据,可以选择往后预测的年数,选择好数据之后,可以得出预测的每一年的每一用地类型面积数据。在此过程之后,可以继续使用此CARS输入的数据继续模拟,也可返回二(3)中CARS模块,重新输入不同的年份预测。在此过程之后,可以继续使用此CARS输入的数据继续模拟,也可返回二(3)中CARS模块,重新输入不同的年份预测。

qq_42831270的博客 5806

rv1126 读取sensor输入,输出到屏幕显示【RK_MPI API接口】

rv1126 libdrm VO

学习记录 1万+

进程间通信 - 邮槽实现

引子 前面的一篇博文介绍了进程之间通信的一种最为简单的方式, 也就是在本地进程之间通过剪贴板来实现进程间通信,而剪贴板自有其缺陷, 很显然的是,剪贴板只能在本地机器上实现, 无法实现本地进程与远程服务器上的进程之间的通信, 那么有没有办法实现本地进程和远程进程的通信呢? 办法自然是有的,要是实在搞不出, 我拿 Socket 来实现本地进程和远程进程的通信来实现也是可以的, 但是你想...

weixin_34348111的博客 288

学习海康VisionMaster之圆查找

(1):ROI选中位置修正,并且修正信息需要选择刚刚创建的位置修正组件输出信息,这里的话后续的检测窗口一般都需要做这一步,因为大部分的应用场景都是需要用到实时跟踪的。圆查找模块是用于查找指定区域的圆,并且会输出该圆的相关参数信息,比如圆中心点,圆半径,圆是否存在等信息。7):剔除点数:和高级参数里面的剔除距离搭配使用的,就是过滤较远的边缘点,让拟合圆心出来的轮廓更加接近。中的圆查找,相当于就是拟合圆心,这个在视觉软件中的应用也是非常广泛的,通常用于定位,测量项目。

yuhouxiyang的专栏 2104

邮槽的使用

windows NT ,windows 2000,windows95 he windows98提供了一种简单的单向"进程间通信机制" ,名字很奇怪,叫邮槽.(mailslot)..简单的说, 通过邮槽,客户端进程可将消息传送或广播给一个或多个服务器进程...在同一台机器或在跨整个网络的不同计算机的进程之间,用邮槽来开发是相当简单的事情.由于邮槽是围绕一个广播通信体系设计出来的,所以它的可靠性不

勇气凛凛 1230

【Basis】Lumerical licence center 无法连接的问题

端口,我们需要确认该端口是否被其他程序占用。这里我们将介绍如何处理这一问题。后,今天电脑更新后我无法打开。终结占用该端口的程序后再次打开。

u011699626的博客 314

YOLOv11旋转目标检测详解:从原理到实战的全面指南

本文介绍了YOLOv11旋转目标检测技术的核心概念、架构设计与应用场景。传统目标检测使用水平边界框(AABB)存在背景噪声大、定位精度低等问题,而旋转边界框(OBB)通过引入角度参数显著提升了检测精度,在遥感、OCR、工业质检等领域具有独特优势。YOLOv11-OBB采用改进的多尺度检测层、CSPDarknet53骨干网络和双通道角度输出机制,在保持实时性的同时实现精确的旋转目标检测。实验表明,该方法在DOTA数据集上达到81.3%的mAP,相比传统方法提升显著,特别适合处理具有旋转特性或高宽比悬殊的目标。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 301

邮槽

Microsoft Windows NT, Windows 2000, Window 95 和Windows 98 ----但不包括Windows CE----提供了一种简单的单向的"进程间通信"(interprocess communication,  IPC)机制. 这个机制的名字非常古怪,叫做"邮槽(Mailslot).用最简单的话来说,通过邮槽,客户机进程可将消息传送或广播给一个或多个服务

MOKA 818

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

[Win]进程间通信——邮槽Mailslot

进程间通信 进程的地址空间是私有的。出于安全性的目的,如果一个进程不具有特殊的权限,是无法访问另外一个进程的内存空间的,也无法知道内存中保存的数据的意义。但是在一些具体的应用情况下需要多个进行相互配合,有时计算机用户也需要在多个应用程序之间交换数据。 Windows系统下,在进程间通信或共享数据的方式如下。 邮槽( Mailslot)。邮槽是最为简单的进程间数据共享方式,一个进程创建

超越 7529

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

邮槽通信

邮槽定义 邮槽(Mailslot)也称为邮件槽,其是 Windows 提供的一种用来实现进程间通信的手段, 其提供的是基于不可靠的,并且是单向数据传输的服务。 邮件槽只支持单向数据传输,也就是服务器只能接收数据,而客户端只能发送数据, 何为服务端?何为客户端? 服务端就是创建邮槽的那一端,而客户端就是已存在的邮件槽的那一端。 还有需要提及的一点是,客户端在使用邮槽发送数据的时候只有当数

Ginvar的专栏 1425

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

用邮槽进行进程间通信

   在Windows环境下,实现进程间通信的方式有很多种,如套接字、管道、远程过程调用和NETBIOS等,邮槽是其中实现单通道进程间通信的一种。创建邮槽的进程被称为邮槽服务器,而其它发送消息给邮槽的进程被称为邮槽客户端。邮槽客户端能发送消息给本机的邮槽,也可发送消息给局域网内其他计算机内的邮槽,所有这些消息都存储在邮槽内,直到邮槽服务器读取它。这些消息通常是以广播的方式发送,建立在面向无链接的数

immcss的专栏 798

MFC—邮槽与管道

邮槽和管道是完成进程间通信的重要方法,用于在进程间传输各种类型的数据。邮槽是单向的数据传输通道;管道又分为匿名管道和命名管道,匿名管道是本地的双向数据传输通道,命名管道是支持网络和本地两种方式的双向数据传输通道。

御承扬的博客 821

windows 进程间通信--邮槽通信的实现

邮槽除了可以再本机内进行通讯外,还可以在主机之间进行通讯(使用UDP协议),想要通过网络进行通讯必须知道服务端的主机名和域名。邮槽的通讯是单向的,只有服务端才能从邮槽中读取消息,客户端只能写入,消息被写入后以队列的方式保存。每个进程都有自己独立的4G内存空间,彼此是不能直接互相访问的。是windows系统中最简单的一种进程间的通信方式,一。,不同于其他只能携带两个固定参数的消息。WM_COPYDATA是一个特殊的,属性, 链接器 系统 :子系统改为。属性,链接器,高级 : 入口点填写。

ylh的博客 600

邮槽mailslot通信学习

代码相关出处:《Windows网络编程技术》第3章 邮槽 邮槽为轻量级进程间通信应用。邮槽使用方便。 邮槽使用的缺点有如下两点。 是不可靠传输。客户端向服务端单向数据通信。 邮槽服务端代码,IPCServer.cpp文件如下。 // IPCServer.cpp : Defines the entry point for the console applic

Segen_Jaa的专栏 1197

进程的通信 - 邮槽

邮槽是Windows系统提供的一种单向进程间的通信机制。对于相对简短的地坪率信息发送,使用邮槽通常比命名管道或者Unix域套接字更简单使用邮槽通信的进程分为服务端和客户端。邮槽,在创建时需要指定邮槽名,创建后邮槽。在邮槽创建后,客户端可以通过邮槽名打开邮槽,在获得句柄后可以向邮槽写入消息。,只有服务端才能从邮槽中读取消息,客户端只能写入消息。消息先入先出。客户端先写入的消息在服务端先被读取。通过邮槽通信的数据可以是任意格式的,但是一条消息。邮槽除了在本机内进行进程间的通信外,在主机间也可以通信。

qq_54169998的博客 940

(六)Win32进程通信 —— 邮槽的使用

邮槽 邮槽是Windows操作系统提供的一种单向进程间通信机制,可用于单机或者网络上的多机分布式环境。对于相对简短的低频率信息发送,使用邮槽通常比命名管道或者Unix域套接字更简单。 从中我们可以读出三个简单的信息: 邮槽传输数据是单向的(客户端 --> 服务端) 可以在进程间通信,也可以在网络间通信 每次传输的数据比较小(400B) 邮槽的名称: \\\\.\\mailslo...

浪子花梦 965

邮槽实现进程间通讯

  ·         邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输·         邮槽是一种单向通信机制,创建邮槽的服务器进程读取 数据,打开邮槽的客户机进程写入数据·         为保证邮槽在各种Windows平台下都能够正常工作,我们传输消息的时候,应将消息的长度限制在424字节以下  邮槽提供一种进程间通讯能力的方法。任何进程都可以创建一个邮槽,

Johnny的专栏 2772

进程间通信(6) 邮槽

邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输。 邮槽是一种单向通信机制,创建邮槽的服务器进程读取数据,打开邮槽的客户端写入数据。 邮槽可以实现一对多的单向通信。但是数据量小,通常都是424字节以下。假设client1先send,client2再send,最后server可以连续receive两次 如果是网络通信,server的名称写".",client写服务器电脑名或ip地址 1. 过程 a. server 先CreateMailslot b. client 再CreateFil.

thefist的专栏 543

进程间通信之邮槽

  简介有时候我们需要一个程序与另一个程序之间进行通信。你可能在多台机器上有多个服务器运行,而在一个中央位置对一个或多个服务器进行远程监控。Windows平台为我们提供了一系列通信方式,从Socket到命名管道,DDE,DCOM,邮槽等。本文中作者将探讨邮槽这一通信机制,假定读者熟悉CreateFile(),ReadFile(),WriteFile()等API函数,此外还假定读者熟悉重

663

「邮槽」单向进程间通信——Console程序设计

创建本地邮槽—服务端/客户端—进行进程间通讯

孤云出岫, 去留一无所系. 朗镜悬空,静躁两不相干. 1154
上一篇: 进程间通信详解 - 命名管道实现
下一篇: 进程间通信详解 - 剪贴板实现
雪岢奇
博客等级 码龄17年 310粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值