文章目录前言原理初探共享内存的创建过程系列 API 的使用ftokshmgetshmatshmdtshmctl共享内存实例 前言 总结一下最近对于共享内存的学习, 可能比较浅显或者有疏漏, 欢迎指正! 原理初探 我们知道, 进程空间相互隔离, 互相对立, 但是共享内存允许多个进程可以访问同一块内存来达到进程间通信的目的. 共享内存是最高效的 IPC 机制, 它不涉及任何进程间的数据传输, 而且他和进程同处于用户空间, 不像消息队列, 信号量是内核空间的系统对象, 不需要花费额外的数据拷贝, 但是同时他并没有预防竞态条件, 也就是说在多进程利用共享内存进行通信的情况下, 我们需要自己去利用锁等操作来进行同步 共享内存的创建过程 当我们创建了一块共享内存, 其实是在 tmpfs 中创建了一个文件 (这个文件是存储于内存的), 也就意味着在 tmpfs 中创建了一个 iNode 节点 然后我们需要将这个创建好的文件映射到进程中 (如下图, 此图来自网络, 应该是哪个博客或者知乎吧…已经记不清了) 我们创 继续阅读 >>


吕子健 18/11/08 23:11:47
文章目录创建线程std::thread 类使用join()使用 detach()警惕作用域线程不能复制给线程传参传递指针传递引用以类成员函数为线程函数以容器存放线程对象互斥量std::mutexstd::lock_guard条件变量call_once 创建线程 C++11 增加了线程以及线程相关的类, 而之前并没有对并发编程提供语言级别的支持 std::thread 类 使用 std::thread 类来创建线程, 我们需要提供的只是线程函数, 或者线程对象, 同时提供必要的参数 std::thread 表示单个执行的线程, 使用thread 类首先会构造一个线程对象, 然后开始执行线程函数, #include <iostream> #include <thread> //需要包含的头 using namespace std; void func(int a, double b) //有参数, 参数数量不限 { cout << a << ' 继续阅读 >>


吕子健 18/09/30 16:27:30
三次握手过程中 TCP 的状态变化 三次握手的过程和本质 三种状态 socket 函数 listen 函数 connect 函数 accept 函数 值-结果参数 connect 函数在三次握手中的返回情况 总结一下近日所学的关于 TCP 建立连接 三次握手 的过程中, TCP 的 状态变化, 以及在这个过程中所用的 socket 函数, 对于各种情况会如何处理 涉及到 connect listen accept 函数 三次握手过程中 TCP 的状态变化 三次握手的过程和本质 如下图, 是一个 TCP 建立和断开连接的过程, 我们今天只讨论建立连接的三次握手过程 主动申请连接的一方(通常为客户端), 发送一个 SYN 报文段, 服务器在收到客户端发来的 SYN 报文段后, 回复一个 SYN 报文段, 并发送一个 ACK 以确认客户端的 SYN, 为了确认服务器的 SYN, 客户端也会回复一个 ACK 经 继续阅读 >>


吕子健 18/09/04 14:58:46
终端输入 sudo netease-cloud-music 但是这意味着终端不能关闭, 而且每次都要这样实在是麻烦, 发现是 sudo, 那肯定是权限问题了, 所以只要更改网易云的执行权限就好了 打开 /usr/share/applications 目录, 在下面找到网易云 ( netease-cloud-music.desktop ) 更改其执行权限sudo chmod 777 netease-cloud-music.desktop (每个人都有读和写以及执行的权限) 重启 OK了 作者:weixin_36888577 发表于 2018/08/20 11:28:51 原文链接 https://blog.csdn.net/weixin_36888577/article/details/81868462 继续阅读 >>


吕子健 18/08/20 11:28:51
特点 Linux 内核于内核2.6.25提供了一种创建定时器的 API, 那就是 Linux 特有的 timerfd API, 并且该定时器可以从文件描述符中读取其创建的定时器到期通知. 这也意味着, 可以将文件描述符通过多路复用监听并读取, 而其他的定时器想要将一个 (或多个) 定时器与一组文件描述符放在一起同时监听可不是一件容易的事. 函数接口 timerfd 系列 API 有三个系统调用 : 第一个系统调用, 该系统调用创建一个新的定时器对象 : #include <sys/timerfd.h> int timerfd_create(int clockid, int flags); //成功返回一个指代该对象的文件描述符, 失败返回-1及errno 第一个参数 clockid 可以设置为 CLOCK_REALTIME 和 CLOCK_MONOTONIC CLOCK_REALTIME 可设定的系统级实时时钟. 相对时间,从1970. 继续阅读 >>


吕子健 18/08/10 22:26:11
下载最新 wps 安装包 官网下载 下载 libpng12-0_1.2.54-1ubuntu1_amd64.deb 下载字体wps-office-fonts_1.0_all.deb 执行命令 sudo dpkg -i libpng12-0_1.2.54-1ubuntu1_amd64.deb 执行命令 sudo dpkg -i wps-office_10.1.0.5707~a21_amd-64.deb 执行命令 sudo dpkg -i wps-office-fonts_1.0_all.deb ok了 作者:weixin_36888577 发表于 2018/08/07 21:23:00 原文链接 https://blog.csdn.net/weixin_36888577/article/details/81488861 继续阅读 >>


吕子健 18/08/07 21:23:00
选择gettimeofday()函数的原因:精度比timer()函数高很多,time函数只精确到秒,而gettimeofday精确到微妙,足以满足各种所需,虽然有精度比它更高的,但是它的系统调用开销相对更小 函数原型 #include<sys/time.h> int gettimeofday(struct timeval* tv, struct timezone* tz); 成功返回0, 失败返回-1, 出错返回errno 参数意义 tv是指向下面这个结构体的一个指针 struct timeval { time_t tv_sec; suseconds_t tv_usec; } time_t 和suseconds_t 都是lont int 类型, tv_sec 表示Epoch 秒数, 而tv_usec 是额外的微妙精度 tz 是一个历史产物, 早期的UNIX实现用来获取系统的时区信息, 目前已经被废弃了, 应始终将其置为NULL. 继续阅读 >>


吕子健 18/08/03 17:16:10
今天敲了这样一段代码 class t { public: vector<shared_ptr<thread> > t1; public: t() { for (int i = 0; i < 3; i++) { t1.push_back(make_shared<thread>(&t::Func, this)); //(1) } } void Func() { cout << " hello world!" << endl; } }; 我在(1)的部分得到报错: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member funct 错 继续阅读 >>


吕子健 18/07/25 09:40:43
 c++11增加了一个新的类型--右值引用,而移动语义是通过右值引用来匹配临时值的.  尽管不能将一个右值引用直接绑定到一个左值上,但可以通过move将一个左值显示的转换为对应的右值引用类型  move,这是一个具有迷惑性的名字,实际上,move函数并没有真正的移动对象,他只是将该对象从一个左值转换为一个右值   #include <iostream> #include <string> using namespace std; void func(string&& str) { cout << "here is func : " << str << endl; } int main() { string a = "here is a test"; func(move(a)); cout << "a : " << a << endl < 继续阅读 >>


吕子健 18/06/23 22:42:42
学习epoll反应堆发现网上的epoll反应堆都是同一份代码框架… 自己理解、梳理一遍,思路在注释里 #include <stdlib.h> #include <stdio.h> #include <stdio.h> #include <sys/socket.h> #include <sys/epoll.h> #include <arpa/inet.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <time.h> #define MAX_EVENTS 1024 #define BUFLEN 128 #define SERV_PORT 8080 /* * status:1表示在监听事件中,0表示不在 * last_act 继续阅读 >>


吕子健 18/06/02 21:03:51