自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(114)
  • 资源 (1)
  • 收藏
  • 关注

原创 Cpp Concurrency学习笔记1——启动新线程

1,引入C++11中引入了多线程的概念,从此以后编写多线程不一定要用linux的pthread库了。从入职的两家公司看,目前也是推荐使用C++语言的多线程解决方案,而不是linux的解决方案。C++多线程用到的头文件是 <thread>,需要注意的是,编译的时候除了制定C++标准为C++11外,还要加上-pthread选项,或者直接使用-lpthread(所以推测C++底层用的应该还是linux的pthread库吧)。2,一个启动多线程的例子我们启动一个新的线程去执行某个函数。分

2020-06-13 16:33:05 379

原创 Linux学习笔记27——popen

1,引入前面说到,用pipe函数就能创建管道,但是它比较原始。我们需要自己创建子进程、自己创建管道、创建完管道获得管道的文件描述符后需要自己关闭管道两端的某些接口,需要自己在子进程里exec执行命令。其实这些完全可以先封装好,于是有了下面的函数:#include<stdlib.h>FILE* popen(const char* cmdstring, const char...

2019-06-01 11:58:00 2219

原创 Linux学习笔记26——管道

1,引入 管道是进程间通信(IPC)的最常用的用法,但是它有两个限制:管道只能在具有公共祖先的两个进程之前使用,通常是在父进程和子进程之间; 管道通常都是半双工的,即要么父进程写子进程读;要么子进程写父进程读;函数原型如下:#include<unistd.h>int pipe(int fd[2]);输入参数是创建管道成功后,输入端(fd[0])与输出端(...

2019-05-12 21:25:59 395

原创 Linux学习笔记25——条件变量

1,条件变量条件变量非常类似于JS里的信号:线程A阻塞着等待条件变量变为真(监听信号); 线程B发出通知已满足条件(触发信号); 线程A解除阻塞开始后面的操作(响应信号)与之对应的,我们需要一些类型和接口来监听、触发信号。条件变量的类型:pthread_cond_t使用前需要进行初始化:int pthread_cond_init(pyhread_cond_t *rest...

2019-05-02 21:47:31 177

原创 Linux学习笔记24——线程终止 pthread_join

1,如何退出一个线程return 线程执行的那个函数返回了; 线程可以被同一进程中的其他线程取消 :pthread_cancel; 线程调用 pthread_exit,退出当前线程而不退出进程。注意:如果在线程里调用exit、_exit、_Exit,退出的不是当前线程,而是整个进程。#include <pthread.h>void pthread_exit(void...

2019-04-15 22:26:23 1433

原创 Linux学习笔记23——pthread_create 创建线程

1,前言一个进程内可以有多个线程,这些线程可以访问进程的文件描述符、内存。每个线程都有自己的ID,线程ID。线程ID只有在它所属的进程上下午中才有意义。每个线程含有如下信息:线程ID; 寄存器值; 栈; 调度优先级; 信号屏蔽字 errno 线程私有数据一个进程的所有信息都对该进程的所有线程共享,包括:可执行程序的代码; 全局内存; 堆内存; 栈;??? 文件...

2019-04-14 18:41:14 2202 1

原创 Linux学习笔记22——sigsuspend 让指定的信号无法唤醒进程

1,由来让指定的信号无法唤醒进程貌似很简单,只要先设置屏蔽字屏蔽指定的信号,再pause就可以了。以后只要接收到信号,切该信号不是指定的信号就可以结束 pause。但是,这种做法是分两步做的,而信号可以发生在任何时候。如果在设置屏蔽字与pause之间就触发了那个指定的信号怎么办??所以我们需要一个原子操作的函数来实现这一功能。这就是sigsuspend.int sigsuspend(...

2019-04-07 22:42:50 595

原创 Linux学习笔记21——sigsetjmp和siglongjmp 信号里的非局部跳转

1,原型前面提到过,setjmp和longjmp函数可以实现非局部跳转,实现goto语句都不易实现的功能。上一节又提到过,在进入信号处理程序的时候,我们总是先屏蔽当前的信号,以避免在执行这个信号处理程序的时候又收到了一模一样的信号。当信号处理程序返回时,要先回复信号屏蔽字,解除屏蔽。现在问题来了,如果在信号处理程序中调用setjmp和longjmp,实现非局部跳转,那信号屏蔽字会恢复吗...

2019-03-31 22:04:04 660

原创 Linux学习笔记20——sigaction 注册信号的更健壮的方法

1,sigaction原型前面我们已经使用signal函数去注册信号。但是,该方法有两个缺点:使用c99标准编译的话,该方法注册的信号只能被触发一次。想要再次触发就必须再次注册; 如果在执行信号处理程序的时候,又捕获到了信号,则该信号会丢失;所以现在推荐使用的是一个更健壮的函数sigaction来实现相同的功能。不过它的调用要比signal更复杂。其原型如下:#inclu...

2019-03-31 15:59:57 589

原创 Linux学习笔记19——sigpending 获取当前未决的信号

1,未决前面提到过,通过修改 信号屏蔽字可以屏蔽信号。当内核发送了一个对当前进程而言已经被屏蔽的信号,且进程不忽略该信号,那么该信号就是未决的。它并不会被捕获,但是信号也没有消失。等到进程不再屏蔽它时,它就会被捕获。注意,屏蔽与忽略是不同的。进程屏蔽信号,信号还在,只是没被接收;进程对信号的动作为忽略,那是进程已经接收到信号了,只是不采取任何动作。如何获取当前进程的pendin...

2019-03-30 22:42:14 1932 1

原创 Linux学习笔记18——sigprocmask 信号屏蔽字

1,信号集我们可以将多个信号编成一个集合,对集合内的信号进行同样的操作(比如忽略一个信号集内的所有信号)。信号集的数据类型为sigset_t。还有一些与之相关的函数用于初始化信号集、向信号集中添加、删除信号,以及判断某个信号是否在信号集内。原型如下:#include<signal.h>int sigemptyset(sigset_t *set); //将set指向的信号...

2019-03-30 21:32:27 621

原创 Linux学习笔记17——alarm、pause

1,alarm与pause的原型#inlcude <unistd.h>unsigned int alarm(unsigned int seconds);int pause(void);alarm是一个闹钟,在指定的秒数之后发出一个SIGALRM信号; 但是,alarm函数自身是马上就返回的,不用等待n秒之后再返回,异步; 这个信号只能本进程自己接收; 如果在调用al...

2019-03-24 22:27:06 574

原创 Linux学习笔记16 ——signal函数

1,函数原型我们需要一个函数告诉进程,当本进程接收到某个信号时,该调用什么对应的函数。类似与JS里注册事件的操作。signal函数就是为了实现这一功能的。#include <signal.h>void(*signal(int signo, void(*func)(int)))(int);这个表达式太复杂了。说明如下:signal函数有两个输入参数,第一个输入参数为i...

2019-03-23 23:11:17 356

原创 Linux学习笔记15 ——waitpid解释器文件

1,解释器文件前面提到的exec文件都是以一个可执行文件为输入参数,但是实际上其输入参数也可以是一个文本文件。文本文件如何执行?我们在该文件的第一行指定一个可执行程序(解释器)即可。而这个文本文件就被成为解释器文件。解释器文件的第一行的格式如下:#! pathname [option-argument]解释器文件总是以#!开头。pathname指定解释器所在的目录,通常是绝...

2019-03-11 22:53:05 230

原创 Linux学习笔记14 ——execl

1,原型前面我们提到,可以用fork创建一个子进程。但是,这个子进程与原先的父进程共享程序段。也就是说两个进程执行的是同一段代码。这好像并没有太大的用处。正常来说,我们希望的不是创建的新进程可以执行完全不同的功能吗?这要怎么做呢?这就要用到我们今天讲的exec系列函数。通常的做法是,先用fork起一个子进程,再调用execXXX函数将子进程替换成一个指定的程序。这样狸猫换太子之后,新的...

2019-03-10 23:34:28 870

原创 Linux学习笔记13 ——waitpid

1,引出上一节讲到wait的时候提到它有一个奇特的特性,那就是如果子进程一直不终止的话,父进程就阻塞了,啥都做不了,就在那等着。很多时候这未必是我们想要的。同时,wait不能指定等待的是哪个子进程,有任意一个终止它就返回了。waitpid改变了这两点。2,原型#include&lt;sys/wait.h&gt;int waitpid(pid_t pid, int* statloc,...

2019-03-09 22:31:10 174

原创 Linux学习笔记12 ——wait

1,几个概念僵死进程(其实就是zombie,僵尸):一个进程已经终止了,但是它的父进程又还没有对他进行善后(比如通过wait获取该子进程的终止状态,释放子进程占用的资源),那么这个已死的进程就叫僵死进程。话说这个都是老子替儿子善后啊,白发人送黑发人。。。。。 收养:如果一个进程还没终止,但是它的父进程已经终止了,这时候他就成孤儿了。那这个进程终止后岂不无人善后,一定变僵尸??所以系统会自动的...

2019-03-09 22:04:39 163

原创 Linux学习笔记11 ——fork

1,函数原型#includ&lt;unistd.h&gt;pid_t fork(void);函数执行的效果:创建一个子进程。该子进程是原先进程的副本,子进程获得父进程数据空间、堆、栈的副本,而不是共享它们。所以子进程不能直接修改父进程里的变量值。父子进程共享的是代码的正文段。注意共享的是整个代码段,但执行的话当然是fork之后的部分。不过如果i使用goto语句或其他方法的话,也可以...

2019-01-20 20:49:35 294

原创 Linux学习笔记10——进程终止

1,进程终止的8种方式 5种正常方式:从main函数返回; 调用exit; 调用_exit或_Exit; 最后一个线程从其启动例程返回; 从最后一个线程调用pthread_exit 3种异常方式调用abort; 接到一个信号; 最后一个线程对取消请求做出响应其中,_exit与_Exit是立即进入内核,而exit是先执行一些清理处理(包括执行注册的终止处理...

2019-01-20 14:41:37 175

原创 Linux学习笔记9——pthread_mutex

先来一个不用lock的例子 #include &lt;iostream&gt;#include &lt;cstdio&gt;#include &lt;cstdlib&gt;#include &lt;pthread.h&gt; // pthread头文件#include &lt;unistd.h&gt; // sleep的头文件using namespace std;int...

2018-07-18 21:12:22 995

原创 Linux学习笔记8——pthread

#include &lt;iostream&gt;#include &lt;cstdio&gt;#include &lt;cstdlib&gt;#include &lt;pthread.h&gt; // pthread头文件#include &lt;unistd.h&gt; // sleep的头文件using namespace std;// 两个线程pthread_t th...

2018-07-17 19:22:41 201

转载 【转载】三种工厂模式

https://www.cnblogs.com/cxjchen/p/3143633.html

2018-06-03 11:59:40 164

转载 在c++中使用指向数组的引用

原文地址:http://www.cnblogs.com/yonken/archive/2011/05/04/Using_Reference_To_Fixed_Size_Array.html今天在工作中需要在一个把一个class内部的某个数组成员expose(是的,有时候不这样做只是徒增麻烦)给外面使用,于是自然而然就想应该是返回一个指向这个数组的引用会好些。指向数组的引用这种用法虽然不是很

2017-06-04 11:47:59 537

原创 Linux学习笔记7——umask函数

#includemode_t umask(mode_t cmask);umask函数为进程设置文件模式创建屏蔽字,并返回改动之前的值。这个函数的功能比较奇葩,他实际上是规定了创建文件时哪些功能是不能用的,即便你创建时赋予了这个功能,他也将其无视。具体来说,如果umask中设置了“用户读”,则你创建的任何文件必然没有“用户读”权限,哪怕你在open或creat的时候明文表示你需要“用户

2016-12-11 21:50:54 440

原创 Linux学习笔记6——access函数

调用open函数时,是以有效用户而不是实际用户的身份去验证进程对要打开的文件的读写权限。但是有时候我们想知道的是实际用户而非有效用户对某一文件的权限,此时就要用到access函数。 #include&lt;unistd.h&gt;int access(const char* pathname, int mode);int faccessat(int fd, const char* p...

2016-12-06 21:52:12 10802 2

原创 Linux学习笔记5——新建文件的所有者

任何文件都必须要有用户ID和组ID,表征该文件属于谁。用open或creat函数新创建的文件,其用户ID和组ID由系统自动分配,分配的原则如下:新文件的用户ID永远为创建文件的进程的有效用户ID;新文件的组ID则有两种情况:新文件的组ID为进程的有效组ID;新文件的组ID为文件所在目录的组ID;在当前的Ubuntu下,具体的原则是这样的:如果目录

2016-12-04 17:15:32 577

原创 Linux学习笔记4——文件访问权限

1,文件的9个访问权限st_mode的1到9位分别代表着一个文件的9个访问权限,分别如下:用户相关: S_IRUSR 用户读(0x400,第11位位1) S_IWUSR 用户写 S_IXUSR 用户执行 组相关 S_IRGRP 组读 S_IWGRP 组写 S_IXGRP 组执行 其他相关 S_IROTH 其他读 S_IWOTH 其他写 S_IXOT...

2016-11-29 22:10:05 437

原创 Linux学习笔记3——设置用户ID和设置组ID

1,背景知识:与一个进程相关联的ID有6个或更多。这里涉及到的有:表征现在正在执行进程的是哪个人、组:实际用户ID 实际组ID表征以谁的名义来执行这个进程(判断进程的访问权限时,以这个ID为准):有效用户ID 有效组ID通常来说有效用户ID就是实际用户ID,有效组ID就是实际组ID,即默认总是以进程的实际执行者的名义来执行程序,判断程序的系统资源的访问权限。但是如果可执行文...

2016-11-26 15:53:44 3903

原创 Linux学习笔记2——stat与获取文件类型

1,stuct stat一个文件的常用信息,包括:权限、文件类型、文件所有者、文件大小、文件改动时间等信息都存储在一个结构体中,即struct stat。这个结构体定义在stat.h头文件中。基本形式如下:struct stat { mode_t st_mode; //文件对应的模式,文件类型,目录等 ino_t st_ino; //inode节点号 dev_t st_dev

2016-11-22 23:36:06 1704

原创 GDB调试总结

1.        gdb编译:g++ -Wall -g -o study_cpp      study_cpp.cpp-g代表保留编译信息2.        gdb运行gdb          study_cpp3.        设置命令行参数,即设置main函数的输入参数set   args          a       b       c       d    

2016-10-23 11:57:14 430

原创 Linux学习笔记1——不带缓冲的文件I/O函数

1,OPEN_MAX限制名OPEN_MAX代表每个进程最大打开的文件数。注意,这个最大数是一个运行时限制。也就是说,对于一个系统而言,它可能并不是一个一成不变的值;换言之,我们也不能把OPEN_MAX理解成头文件中一个写死的值。为了获得OPEN_MAX的具体值,应当调用函数sysconf().其原型如下:#includelong sysconf(int name);根据输入的na

2016-10-07 20:19:31 592

转载 dup and dup2的剖析

原文出处:http://www.cnblogs.com/sdphome/archive/2011/04/30/2033381.htmldup和dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。如果两个文件描述符指向同一个file结构体,File Status Flag和读写位置只保存一份在file结构体中,并且file结构体的引用计数是2。如果两次open同一

2016-10-05 10:47:16 303

原创 Linux shell 常用命令

1. Root用户,a) su 然后键入密码  su 用于让用户在登录期间变成另外一个用户。后边不带 username 使用时,su 默认会变成超级用户。b) sudo  -s 然后键入密码2. 不同的cda) cd ..   返回上一级目录b) cd /   进入根目录c) cd 或cd ~    进入当前用户的主目录,即/home/hyd) 当前目录cd .

2016-10-03 21:44:53 361

转载 QT的信号与槽机制介绍

出处:http://blog.chinaunix.net/uid-20348984-id-1964206.html信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念、元对象工具以及在实际使用过程中应注意的一些问题。QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗口部件集,具有面向对象、易于扩展、真正的组件编程等特

2016-09-05 23:41:43 598

转载 namespace的用法

原文地址:http://www.cnblogs.com/CBDoctor/archive/2011/12/05/2276563.htmlC++中采用的是单一的全局变量命名空间。在这单一的空间中,如果有两个变量或函数的名字完全相同,就会出现冲突。当然,你也可以使用不同的名字,但有时我们并不知道另一个变量也使用完全相同的名字;有时为了程序的方便,必需使用同一名字。比如你定义了一个变量string

2016-08-14 21:00:21 440

原创 数据结构学习笔记10——区分叶结点与分支结点的二叉树实现方案二

与上一篇博文实现的二叉树不同,这里讲遍历实现为节点的一个成员函数。VarBinNode2.h/********************************************************/// 用模板实现二叉树(Binary Node)结点的定义// 区分叶结点与分支结点,将遍历作为成员函数/******************************

2016-08-08 20:05:09 1989

原创 数据结构学习笔记9——区分叶结点与分支结点的二叉树实现方案一

上一篇博客给出的二叉树实现不区分叶结点与分支结点,即叶结点的类中也有两个指向左右子结点的指针,只不过指针为NULL。这种设计实现简单,但是造成了空间上的浪费。这里给出一种将叶结点与分支结点实现为两个不同类的实现方式。不过这两个类都继承自同一个虚基类。具体实现如下:/********************************************************//

2016-08-07 23:16:37 4013 2

原创 数据结构学习笔记8——简单二叉树的实现与遍历

1,简单二叉树的实现回忆链表的实现,我们定义了两个类模板,一个用于表示链表里的结点,另一个用于表示链表本身;但是在二叉树的实现中,我们只定义二叉树的结点,而不再为整个二叉树定义类模板。这里实现的二叉树是最简单的二叉树,结点不区分叶结点与分支结点。即,即便是叶结点,在类中也同样有左子结点与右子结点,只不过左右子结点都是空指针。文件结构如下:BinNode.h定

2016-08-07 17:21:02 563

原创 数据结构学习笔记7——二叉树介绍

1,二叉树相关定义路径(path):如果一棵树的一串结点n1,n2,...,nk满足前一个结点是后一个节点的父结点,则称这一串结点为从n1到nk的路径,这条路径的长度是k-1;路径长度(length):一条路径上的结点数-1;结点的深度(depth):从根节点到节点M的路径长度,根结点深度为0;节点的层数(level):数值上与深度相等,根结点的层数为0;树的高度(heig

2016-08-06 22:06:20 592

原创 数据结构学习笔记6——队列

1,综述队列(queue)是一种受限制的线性表,其属性与看电影排队类似,新加入的必须排在队尾(enqueue,入队),先离开的必须从队首开始(dequeue,出队)。因此,队列是按照到达的顺序来删除元素的,即先进先出(First In First Out).队列的ADT:(Queue.h)/********************************************

2016-07-24 17:25:50 1332

《Boost Asio C++ Network Programming 》 英文原版

作者:john Torjo 学习 C++ Boost Asio的必备教材 浅显易懂 网上流传的中文版漏了大量的内容,看得人云里雾里。所以还是要看英文原版。

2022-12-02

AUTOSAR_SWS_SocketAdaptor中英双语

1,SoAd相关的Ausosar标准 2,中文和英文两份文档,可以对照看

2022-03-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除