UNIX网络编程: IPC之共享内存

C++ IPC进程间的通信《C++多线程编程实战》 临界值:程序中能被访问共享内存的部分 进程间通信示例:程序一开始就有2个进程,它们在一个普通窗口中完成绘制矩形的任务。2个进程相互通信,一个进程再画矩形时,另一个进程要等待 IPCWorker.cpp #include <Windows.h> #include <tchar.h> //_tcscmp() _TCHAR* #define COMMUNI 阅读详情

共享内存:是系统创建的特殊地址空间,允许不相干的多个进程使用该空间,即多个进程能够使用同一块内存的数据;

优点: 共享内存不需要复制数据,直接读写内存,效率非常高;
缺点: 但是它本身不提供同步访问机制,我们可以通过信号量来进行控制其同步访问机制;

共享内存的操作函数如下:
shmget

int shmget(key_t key,int shmsz,int shmflg)
该函数创建或访问一个共享内存区;
key值是ftok的返回值或是IPC_PRIVATE
shmsz 是创建内存区的大小,以字节为单位,要是创建新的内存区该值必须大于0,要是访问已经存在的内存区,该值为0;
shmflg 是标记,若是创建新的共享内存区,则其值是IPC_CREAT, IPC_EXCL和读写权限的按位或的结果, 若是访问已存在的共享内存区,将该值赋为0即可;
该函数调用成功返回内存区的ID,失败返回-1.

shmat

  void *shmat(int shmid,const void *shmaddr, int shmflg);
该函数的作用是将内存区附接到调用进程的地址空间,成功返回内存区的起始地址,失败返回-1;
shmid是共享内存区的标示符;
若shmaddr为空指针,则表示让系统替调用者选择地址(推荐使用该方式),若shmaddr不为空指针,那么返回地址取决于调用者是否给shmflg指定了SHM_RND值;若没有指定SHM_RND,那么相应的共享内存区附接到shmaddr指定的地址;若指定SHM_RND,那么相应的共享内存区附接到shmaddr指定的地址向下舍入一个SHMLBA常值,LBA是指“低端边界地址”;
shmflg参数同shmget;

shmdt

int shmdt (const void *shmaddr)
该函数的作用是断接内存区, 但是不删除共享内存区;
该函数成功返回0,失败返回-1;
shmaddr是共享内存区的起始地址;

shmctl

int shmctl(int shmid, int cmd,struct shmid_ds *buf)
对共享内存的操作函数;
shmid共享内存区标示符;
cmd 是对共享内存区所作的操作:其可选参数如下:
IPC_RMID:从系统中删除由shmid所指定的共享内存区并拆除共享内存区,(拆除值的是释放或i或回收与共享内存区对应的数据结构,及放在其上的数据);
IPC_SET: 给所指定的共享内存区设置shmid_ds结构的相应成员;
IPC_STAT:通过(buf)向调用者返回指定的共享内存区的当前的shmid_ds结构;

以下是一个测试这几个函数的单个服务器和单个客户的程序:
服务器端的代码

#include "utility.h"

int main(int ac, char **av)
{
    key_t shm_key = ftok(av[1], 0xFF);
    if(shm_key == -1){
        printf("shm ftok error.\n");
        exit(1);
    }
    printf("shm ftok ok.\n");

    int shm_id = shmget(shm_key, 1024, IPC_CREAT|IPC_EXCL|0666);  //创建或打开一个共享内存
    if(shm_id == -1){
        printf("shmget error.\n");
        exit(1);
    }
    printf("shmget ok.shm_id = 0x%x\n", shm_id);

    char *addr = (char *)shmat(shm_id, NULL, 0);   //连接被共享内存ID分割的共享内存段和调用进程
    if(addr == (void *)-1){   //shmat失败返回(void*)-1
        printf("shmat error.\n");
        shmctl(shm_id, IPC_RMID, NULL);   //shmat失败,删除共享内存
        exit(1);
    }

    key_t sem_key = ftok(av[1], 0xFE);   //用信号量来为共享内存提供同步机制,共享内存虽然是IPC机制中最快的,但是其不提供同步机制
    if(sem_key == -1){
        printf("sem ftok error.\n");
        shmctl(shm_id, IPC_RMID, NULL);   //得到信号量键值失败,删除共享内存
        exit(1);
    }

    int sem_id = semget(sem_key, 2, IPC_CREAT|IPC_EXCL|0666);  //创建信号量
    if(sem_id == -1){
        printf("semget error.\n");
        shmctl(shm_id, IPC_RMID, NULL);  //创建信号量失败,删除共享内存
        exit(1);
    }

    union semun init;   //信号量共用体
    init.val = 0;
    semctl(sem_id, 0, SETVAL, init);   //信号量设置初始值
    semctl(sem_id, 1, SETVAL, init);

    struct sembuf p = {0, -1, 0};   //对信号的PV操作(p是减一,v是加一)
    struct sembuf v = {1, 1, 0};

    while(1){
        printf("Ser:>");
        scanf("%s", addr);
        if((strncmp(addr, "quit", 4)) == 0){
            shmdt(addr);    //退出之前先断开与共享内存的连接
            shmctl(shm_id, IPC_RMID, NULL);  //删除共享内存
            semctl(sem_id, 1, IPC_RMID);     //删除下标为1的信号量
            semctl(sem_id, 0, IPC_RMID);     //删除下标为0的信号量
            break;
        }
        semop(sem_id, &v, 1);   //使得下标为0的信号量不阻塞

        semop(sem_id, &p, 1);    //阻塞下标为0的信号量
        printf("Cli:>%s\n", addr);
    }

    return 0;
}

客户端的代码:

#include "utility.h"

int main(int ac, char **av)
{
    key_t shm_key = ftok(av[1], 0xFF);
    if(shm_key == -1){
        printf("shm ftok error.\n");
        exit(1);
    }
    printf("shm ftok ok.\n");
    int shm_id = shmget(shm_key, 0, 0);
    if(shm_id == -1){
        printf("shmget error.\n");
        exit(1);
    }
    printf("shmget ok. shm_id = 0x%x\n", shm_id);

    char *addr = (char *)shmat(shm_id, NULL, 0);
    if(addr == (void *)-1){
        printf("shmat error.\n");
        exit(1);
    }

    key_t sem_key = ftok(av[1], 0xFE);
    if(sem_key == -1){
        printf("sem ftok error.\n");
        exit(1);
    }
    printf("sem ftok ok.\n");
    int sem_id = semget(sem_key, 0, 0);
    if(sem_id == -1){
        printf("semget error.\n");
        exit(1);
    }
    printf("semget ok.\n");

    struct sembuf p = {1, -1, 0};
    struct sembuf v = {0, 1, 0};

    while(1){
        semop(sem_id, &p, 1);   //阻塞下标为1 的信号量
        printf("Ser:>%s\n", addr);

        printf("Cli:>");
        scanf("%s", addr);
        if((strcmp(addr, "quit")) == 0){
            semop(sem_id, &v, 1);  //客户端在断开连接之前先将消息发送给服务器端
            shmdt(addr);          //之后客户端断开与共享内存之间的连接
            break;
        }
        semop(sem_id, &v, 1);  //使得下标为0 的信号量不阻塞
    }

    return 0;
}

utility.h头文件:

#pragma once

#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

union semun
{
    int val;
    struct semid_ds *buf;
    unsigned short *array;
    struct seminfo *__buf;
    void *__pad;
};

makefile文件:

all:ser cli

ser:ser.cpp
    g++ ser.cpp -o ser

cli:cli.cpp
    g++ cli.cpp -o cli

.PHONY:clean

clean:
    rm ser cli
从MCU到MPU:基于i.MX6ULL的嵌入式Linux智能网关开发实战 嵌入式系统开发正从传统的单片机裸机编程,向基于Linux操作系统的复杂应用演进。其核心原理在于利用Linux强大的内核、驱动模型和丰富的软件生态,通过裁剪和定制,为资源受限的嵌入式硬件构建一个完整的、可管理的计算机系统。这一转变的技术价值在于,它使得开发者能够处理更复杂的任务,如多任务调度、网络通信、文件系统管理等,从而满足工业物联网、智能网关等场景对高性能、高可靠性和强连接性的需求。应用场景广泛覆盖数据采集、协议转换、边缘计算等领域。本文以热门的i.MX6ULL处理器和高效的Buildroot构建系统为例 阅读详情

相关推荐

《UNP》-IPC学习笔记(1):IPC综述

1. 《UNP》是《UNIX Network Programming》,unix网络编程这本书的简称。作者是:W.Richard Stevens,他是unix与网络方面的专家,他写了几本书,都是unix和网络方面的经典:(1). 《APUE》一卷,《AdvancedProgramming in the UNIX Environment》中文称为unix环境高级编程。是一本详细描述unix类系统调用

jiangnanyouzi的专栏 2181

IPC - Unix - 共享内存

1、共享内存 共享内存允许两个或多个进程共享一给定的存储区,是最快的一种进程间通信机制。对于像管道和消息队列等通信方式,需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方

DSs 473

IPC之九:使用UNIX Domain Socket进行进程间通信的实例

socket编程是一种用于网络通信的编程方式,在socket的协议族中除了常用的AF_INET、AF_RAW、AF_NETLINK等以外,还有一个专门用于IPC的协议族AF_UNIX,IPC是Linux编程中一个重要的概念,常用的IPC方式有管道、消息队列、共享内存等,本文主要介绍用于本地进程间通信的UNIX Domain Socket,本文给出了多个具体的实例,每个实例均附有完整的源代码;本文所有实例在Ubuntu 20.04上本文的实例中涉及多进程编程等,本文对Linux编程的初学者有一些难度。

whowin 5365

Unix/Linux编程:POSIX共享内存

引入 System V 共享内存和共享文件映射允许无关进程共享内存区域以便执行IPC技术,这两种技术都存在一些不足 System V共享内存模型使用的是key和标识符,这与标准的Unix IO模型使用文件名和描述符的做法是不一致的。这种差异意味着使用System V共享内存段需要一整套系统调用和命名 使用一个共享文件映射来进行IPC要求创建一个磁盘文件,即使无需对共享区域进行持久存储也需要这样做。除了因为需要创建文件所带来的的不便之外,这种技术还会带来一些文件 I/O 开销 由于存在这些不足,所以 PO

OceanStar的博客 589

UNIX网络编程第二卷:精通进程间通信(IPC)

本文还有配套的精品资源,点击获取 简介:《UNIX网络编程卷2:进程间通信》是W. Richard Stevens所著的经典作品,系统地讲解了UNIX系统中进程间通信的关键技术和方法。本书涵盖了管道、信号、共享内存、消息队列、信号量、套接字、命名管道、内存映射以及进程间同步与互斥等核心概念。通过这本书,读者将深入了解如何在UNIX系统上实现高效的多进程应用,并掌握包括实用程...

weixin_35696112的博客 1455

Redis 可视化工具 RedisInsight 的保姆级安装以及使用(最新)

Redis 可视化工具 RedisInsight 的保姆级安装以及使用(最新)

一名全栈小白的博客 1万+

UNIX环境高级编程_进程间通信_信号,管道,消息队列,共享内存,信号量

记录了进程通信的实现方式,分别是:信号,有名管道,无名管道,消息队列,共享内存,信号量。

weixin_43916755的博客 612

VPS环境搭建及配置

VPS(Virtual Private Server)是一种虚拟化技术,可以将一台物理服务器分成多个虚拟服务器,每个虚拟服务器都有独立的操作系统和资源,相互之间互不影响。VPS可以提供类似于独立服务器的功能,但价格更便宜,适合中小企业和个人用户使用。VPS可以用于网站托管、应用程序部署、游戏服务器、数据备份等各种场景。

YJ_12340的博客 1万+

2-18 共享内存通信

(本节笔记的实验代码,在这里) 1.  基本概念     共享内存是IPC机制中的一种,作用是使得两个不相关的进程访问同一段内存,是一种进程间传输数据的一种有效方式。   2.  函数学习     2.1  创建/获取共享内存         函数名:                 shmget         函数原型: man shmget

实验代码库在:github.com/elvinsys 349

无人机蜂群联合指挥作战技术详解

随着人工智能、通信技术、新材料等领域的不断进步,无人机蜂群联合指挥作战技术将迎来更加广阔的发展前景。未来,无人机蜂群将更加智能化、自主化,能够执行更加复杂、精细的作战任务。同时,加强国际合作,共同制定国际规则和标准,将是推动无人机蜂群技术健康发展的重要方向。无人机蜂群技术,是指通过先进的通信技术、自主导航与决策算法,将大量小型、低成本、功能各异的无人机组织成一个高度协同的群体,执行复杂多样的军事任务。2. 通信与数据链:采用高速、低延迟、抗干扰的通信技术,保障群体内无人机间的信息交换。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 1545

Tomcat源码:Acceptor与Poller、PollerEvent

前文中我们介绍到NioEndpoint的start方法启动了Acceptor与Poller这两个异步线程来处理连接请求,本文我们就来接着介绍这两个组件。目录前言一、Acceptor1、构造方法2、run方法LimitLatchNioChannel二、Poller与PollerEvent2、pollerregisterruneventsprocessKey。

CRUD工程师 2065

UNIX网络编程 卷二 IPC

2011.9.19  UNIX网络编程 卷二 IPC 1、IPC(interprocess communication)即进程间通信. 2、4种IPC形式: 1)消息传递(管道pipe、命名管道FIFO、消息队列) 2)同步(互斥量、条件变量、读写锁、文件与记录锁、信号量

陆郎 616

Linux系统故障排查思路实践教程(上)

本文主要介绍了Linux系统日志分析与常见故障排查的实用方法。首先从系统日志的分类及其涉及的日志文件进行说明;其次详细讲解了忘记用户密码的解决方案;接着对系统无法启动问题,提供了异常断电后修复文件系统、/etc/fstab文件丢失恢复等常见故障的处理方案。最后介绍了文件系统只读错误的排查思路和修复方法,包括磁盘空间检查、文件系统修复等实用技巧。全文提供了大量具体命令和操作流程,为Linux系统维护人员提供了实用的故障处理指南。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 328

《UNIX网络编程 卷2》 笔记: 简介

总述     W.Richarqd Stevens的《UNIX网络编程 卷2:进程间通信》主要讲解Linux进程间通信(IPC),其中也包括一些同步机制。     本系列 《UNIX网络编程 卷2》 笔记 文章主要根据书上内容记录一些笔记。在笔记中我主要关注IPC的三大领域:     (1)消息传递(管道、FIFO、消息队列)     (2)同步(互斥锁、条件变量、读写锁、信号

alenliu's blog 5866

【高级】系统架构师 | 2026年上半年案例分析真题

标准答案:系统因缺乏足够历史数据(用户行为、物品信息或评分等),难以做出准确推荐的问题。另外两种:物品冷启动(新课程 / 新知识点缺少互动数据)系统冷启动(平台上线初期整体数据稀缺)类型典型表现常见缓解用户冷启动新注册学员无历史问卷/前测、热门兜底、人口统计学特征、知识图谱前置测评物品冷启动新课无人学无人评内容特征推荐、专家标注、探索流量系统冷启动新平台双边都稀缺规则引擎、运营冷启、知识图谱强约束路径本题已点明「用户冷启动」,另外两种按推荐系统经典三分法作答即可。

大胆尝试,小心实践 358

MFC实现简单UDP通信(附完整源码)

MFC实现简单UDP通信(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1108

UNIX网络编程第2版,第2卷,进程间通信:英文影印版

UNIX网络编程第2版,第2卷,进程间通信:英文影印版【作  者】(美)W.Richard Stevens [同作者作品] [作译者介绍] 【丛 书 名】 图灵原版计算机科学系列 【出 版 社】 人民邮电出版社 【书 号】 9787115215116 【上架时间】 2009-10-30 【出版日期】 2009 年11月 【开 本】 16开 【版 次】2-1 【内容简介】本书是一部UNIX网络编程...

yangzhiyong77 187

Cadence OrCAD Capture CIS元器件管理时ERROR(ORCIS-6454): Temporary part number tracking is turned on报错的解决方法

使用Part manager对工程的元器件进行批量管理时,出现如下图所示的ERROR(ORCIS-6454): Temporary part number tracking is turned on报错其解决方法如下。

fydar的博客 3499

POSIX Vs System V

看《UNIX网络编程卷二: IPC》,基本是前一章介绍POSIX, 后一章就介绍 System V, 没有好好看各派的区别,懒得都看,搜索之,以解惑!显然,UNP对POSIX的介绍要详细得多,而 System V则显得比较轻。原来,POSIX是标准化组织推行的,适合系统之间移植,更简单一些。而System V 历史较为悠久,接口比较复杂。另一方面,可能有些系统尚未对POSIX做实现,而syst

violetfeeling的专栏 6739

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

温度PID控制PLC程序

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

进程间的通信方式

记录最近看的关于进程间通信的文章。

小人物大青春的博客 1270

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C/C++Unix网络编程-IPC简介

IPC是进程间通信的简称。 进程、线程与信息共享 Unix进程间的信息共享的方式: (1) 左边的两个进程共享存留于文件系统中某个文件上的某些信息。为访问这些信息、每个进程都得穿越内核(例如read、write、lseek等)。当一个文件有待更新时,某种形式的同步是必要的,这样既可保护多个写入者,防止相互串扰,也可保护一个或多个读出者,防止写入者的干扰。 (2)中间的两个进程共享驻留于内核中的某些信息。是这种共享类型的一个例子,System V消息队列和System V信号量也是。现在访问共享信息的每次操

NINE_world的博客 2856

深度学习工具包 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")

浅谈UNIX网络编程system V IPC机制

一.System V IPC 的构成    1.system v消息队列    2.system v信号量    3.system v共享内存 我们把这三种工具统称为System V IPC的对象,每个对象都具有一个唯一的IPC标识符(identifier)。

hyj_zkdzslh的博客 548

嵌入式Linux网络编程:UNIX Domain Socket进程间通信(IPC)

通过本文,您可掌握UNIX Domain Socket在嵌入式Linux中的高效IPC实现方法。相比网络套接字,UDS在本地通信场景中性能更优、资源占用更少,非常适用于嵌入式设备的多模块协作!

m0_64657422的博客 1208

UNIX网络编程笔记:共享内存区和远程过程调用

Posix共享内存区:高效进程通信的标准化方案 Posix共享内存区通过标准化接口(如shm_open、shm_unlink)提供跨平台统一解决方案,简化了共享内存的创建与管理。相比传统IPC,它具有以下优势:1)通过文件系统路径名标识,避免复杂描述符传递;2)支持权限控制;3)与内存映射(mmap)无缝结合。典型应用包括:1)匿名映射实现临时数据共享;2)文件映射保障数据持久化;3)结合信号量解决多进程同步问题。尽管存在内存对齐、缓存一致性等挑战,但通过合理设计,Posix共享内存仍是高性能进程通信的核心

梅见十柒的博客 1336

Linux 网络编程:使用Socket套接字实现IPC进程间通讯

Socket IPC结合了网络编程的灵活性和本地通信的高效性,是Linux系统编程中的重要工具。通过本文的学习,你不仅掌握了Socket IPC的实现方法,还了解了各种IPC方式的适用场景。在实际项目中,根据具体需求选择合适的IPC方式,往往能达到事半功倍的效果。关注我,持续更新 Linux/C++/网络编程干货!

buyutang_的博客 1007

UNIX网络编程卷1和2资源推荐:深入学习UNIX网络编程的必备宝典

UNIX网络编程卷1和2资源推荐:深入学习UNIX网络编程的必备宝典 【下载地址】UNIX网络编程卷1和2资源下载 UNIX网络编程卷1和2资源下载本仓库提供UNIX网络编程卷1和卷2的资源文件下载,包含以下两本书籍:1. **UNIX网络编程卷1:套接字联网API(第3版).pdf**2. **UNIX网络编程_卷2_...

gitblog_09790的博客 704
上一篇: UNIX网络编程:IPC之消息队列
下一篇: UNIX网络编程:IPC之信号量
lm_123_456
博客等级 码龄11年 35粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值