![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
GCC/C/C++
June_Hou
这个作者很懒,什么都没留下…
展开
-
c++ placement new
placement new 是重载operator new的全局版本,不能被重载原型如下:void* operator new(size_t, void* p) throw() {return p;}在已经分配的内存中初始化一个对象,void* 指向一个已经分配好内存的首地址例如:int *p = new int;new(p) int(999);cout<<*p<<endl;...原创 2021-01-29 19:45:49 · 179 阅读 · 0 评论 -
c/c++强符号与弱符号
定义编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号,也可以通过GCC "__attribute__((weak))"来定义任何一个强符号变为弱符号。GCC 中,我们也可以通过使用"__attribute__((weakref))"这个扩展关键字来声明一个对外部函数的引用为弱引用。(__attribute__((weak)))void foo();链接器链接规则不允许强符号被多次定义,如果有多个强符号定义,则链接器报符号重定义如果一个符号在某个目标文件中是强符号,在其他文原创 2021-01-07 15:17:30 · 1009 阅读 · 0 评论 -
快速幂方法
快速幂以下以求a的b次方来介绍:1. 把b转换成二进制数。2. 该二进制数第i位的权为2^(i-1)3. 例如 b=11 二进制为1011 通过二进制求十进制过程 2^0+2^1+2^3 = 11 a^11 = a^(2^0+2^1+2^3) 可以转化为 a^11 = a^(2^0) * a^(2^1) * a^(2^3)因此可以通过位来进制快速幂计算(先不考虑y<0的情况,如果考虑也很简单,如果为负取绝对值,返回1.0/res)double原创 2020-09-22 14:57:56 · 142 阅读 · 0 评论 -
unique_ptr, shared_prt,weak_ptr,make_shared 简单描述及使用
unique_ptr, shared_prt,weak_ptr,make_shared 简单描述及对比#include <iostream>#include <string>#include <vector>#include <memory>class test{ public: test(){std::cout<<"test constructor..."<<std::endl;}原创 2020-08-06 19:46:54 · 238 阅读 · 0 评论 -
c++左值与右值
左值 与 右值/*左右值左值: 在内存中有确定位置的对象右值: 相反, 在内存中没有确定位置*/int a = 10;int& a_ref = a; //ok, 引用必须是左值int&& a_ref2 = a; //error, a是左值,只能对右值引用int && a_ref3 = move(a); //ok, 转换a变为右值,然后对其引用int &a_ref = int(10); //error, 为右值引用int &&原创 2020-07-29 17:21:37 · 108 阅读 · 0 评论 -
c++11新特性std::mem_fn
std::mem_fnmem_fn: 把成员函数转为函数对象,调用mem_fn时,可以使用对象引用,指针,智能指针#include <iostream>#include <functional>#include <memory>class test{ public: test()=default; test(int value):value(value){} virtual ~test()=default原创 2020-07-29 11:10:38 · 561 阅读 · 0 评论 -
shared_ptr 智能指针
shared_ptr 用法shared_ptr部分目的: 为了解决new动态分配的内存空间释放问题, shared_ptr可以把对象全权托管,shared_ptr对象在消亡时会自动执行delete,#include <iostream>#include <memory>class test{ public: test(){std::cout<<"test construct...."<<std::endl;}原创 2020-07-29 10:48:57 · 112 阅读 · 0 评论 -
C++ 静态变量初始化 “undefined reference”
静态变量 undefined reference1. c++头文件, 类中定义static 变量,不要在头文件内类外做初始化(头文件被多次包含,会引起多重定义),也不能在构构函数内初始化。(1.对于类中的静态成员是单独存储的,而不是对象的组成部分, 初始化语名指出了类型,并使用了作用域运算符,但并没有使用关键字static;2. 初始化应该放在方法文件中,而不是类声明文件中进行,因类...原创 2019-12-24 12:00:30 · 2796 阅读 · 0 评论 -
C++ 函数 显示模板 模板 优先级
1.void apple(int a, int b);2.template <class T>void apple(T &a, T&b);3.struct job { int age;};template <>void apple<job>(job &a, job &b);匹配优先级:...原创 2019-12-18 20:06:45 · 291 阅读 · 0 评论 -
mysql数据库 for ubuntu
Ubuntu下Mysql数据库安装与使用教程 来源:DNJS.net 原创 作者:电脑技术网 审核:Admin 时间:2014-08-02 阅读: 69 次 本文将从基础出发,介绍Mysql在Linux环境下的安装和基本使用命令,仅适用于Mysql初学者。安装Mysql数据库这里介绍最最简单的安装方式,至于编译安装,可以下载安装包, ./configure 生成Make转载 2014-11-04 14:19:33 · 554 阅读 · 0 评论 -
epoll 水平触发与边缘触发
转载:https://blog.csdn.net/lihao21/article/details/67631516epoll也是实现I/O多路复用的一种方法,为了深入了解epoll的原理,我们先来看下epoll水平触发(level trigger,LT,LT为epoll的默认工作模式)与边缘触发(edge trigger,ET)两种工作模式。使用脉冲信号来解释LT和ET可能更加贴切。Lev...转载 2019-08-01 17:50:47 · 134 阅读 · 0 评论 -
A,B,C,D四个进程,A向buf里面写数据,B,C,D向buf里面读数据, 当A写完,且B,C,D都读一次后,A才能再写。用P,V操作实现。 解决方法
信号量:b_r=1, c_r=1, d_r=1w=3解决思路:P(b_r)P(c_r)P(d_r)A B C DP(w) P(b_r) P(c_r) P(d_r)P(w) read... read... read....原创 2019-08-01 16:46:14 · 774 阅读 · 0 评论 -
linux 驱动之input子系统(gpio-keys)实现
1.概述 Gpio-keys 是基于input子系统实现的一个通用按键驱动,该驱动也符合linux驱动实现模型,即driver和device分离模型.一般按键驱动,都是基于gpio-keys进行开发的.2. gpio-keys 代码分析(基于 linux 4.14.40)(1)整体来说分为以下四步static int gpio_keys_probe(struct platfo...原创 2019-03-28 14:16:19 · 6326 阅读 · 1 评论 -
fatal error: gnu/stubs-32.h: No such file or directory
1.ubuntu 64位主机上编译32位应用.编译出现以下错误/usr/include/gnu/stubs.h:7:27: fatal error: gnu/stubs-32.h: No such file or directory compilation terminated. make: *** [bitmap.o] Error 1这意味着你的pc缺失了32位的libc库,那么安装...翻译 2019-02-18 16:26:24 · 3314 阅读 · 0 评论 -
linux 查看文件引用计数
一.在对文件操作的系统调用接口,并没有提供获取对文件引用计数的信息,所有想要获取此信息,有两种方法: 1.在内核中添加一个系统调用.将内核中文件的引用count计数返回到应用层,这种比较麻烦.不推荐 2.遍历整个系统中所有进程打开此文件的个数./proc/pid/fd/**, 以此来统计引用计数.lsof和fuser可能就是用的此方法,没有做考证.例子如下:june_h...原创 2019-01-11 14:09:51 · 4209 阅读 · 0 评论 -
linux串口编程实例(二)
1.串口设置相关的一个接口 int set_opt(int fd,int nSpeed, int nBits, char nFlow, char nParity, int nStop){ struct termios newtio,oldtio; if ( tcgetattr(fd, &oldtio) != 0) { perror("get...翻译 2019-01-03 11:09:43 · 537 阅读 · 0 评论 -
Linux 串口编程配置相关(一)
1.termios 结构体 tcflag_t c_iflag; /* input modes */ tcflag_t c_oflag; /* output modes */ tcflag_t c_cflag; /* control modes */ tcflag_t c_lflag; /* local modes */ cc_...翻译 2019-01-03 10:54:18 · 306 阅读 · 0 评论 -
automake 最简单的例子(二)
1. 环境及安装的库 automake autoconf aclocal libtool2. 在一个空目录中创建以下文件$$$$ cat src/main.c #include <stdio.h> int main(){ printf("hello world!!!\n"); return 0;}3.执行autoscan$$$$ a...原创 2018-12-17 15:59:29 · 454 阅读 · 0 评论 -
socket: 调用send 线程异常退出问题
ssize_t send(int sockfd, const void *buf, size_t len, int flags);1.send 异常退出,flags可能设置为0了.如果是flag==0, 如果断开连接,这调用send,线程会异常退出.(1)解决方法设置以下flag, 或者重新处理SIGPIPE也可以解决.MSG_NOSIGNAL (since Linux 2.2) ...原创 2018-11-27 11:37:12 · 1534 阅读 · 0 评论 -
宏: TEMP_FAILURE_RETRY(expression)
1.宏所在头文件unistd.h2. 宏原形# define TEMP_FAILURE_RETRY(expression) \ (__extension__ \ ({ long int __result; \ do __result = (...原创 2018-08-13 15:16:21 · 2676 阅读 · 0 评论 -
gcc : (a++)*(a++)问题
int main(){ int a = 5; int b = 0; b = (a++)*(a++); printf("b:%d\n", b); return 0;}结果是25为什么不是30呢,因(a++)*(a++)是一个乘法表达式,(a++)处理需要两条指令,第一条是获取a的值,++在第二条指令,而这个表达式在(a++)第一条指令就已经获取...原创 2018-08-08 17:36:40 · 3270 阅读 · 2 评论 -
静态库与动态库全局变量及函数深入了解
一.静态库全局变量与当前应用全局变量重名编译出错,提示多次定义,因为静态可以看作本是应用的一部分,所以会报重定义.二.动态库全局变量与当前应用全局就量重名编译不会出错,当前应用全局变量覆盖动态库全局变量.三.静态库全局变量与动态库全局变量重名编译不会出错,先链接谁,谁优先.如果多个静态库全局变量重名,编译出错.四,动态库变量被多个进程使用会出现重入问题?不会.当so被load的时候,会把s...原创 2018-07-04 16:58:33 · 6383 阅读 · 3 评论 -
进程间同步之信号量(semaphore)
进程间同步之信号量(semaphore)1. 信号量的创建与使用linux下使用semget创建或打开信号量集,int semget(key_t key, int nsems, int semflg);该函数执行成功则返回一个信号量集的标识符,失败返回-1。返回的参数key是由ftok得到的键值;第二个参数nsems指明要创建的信号量集包含的信号量个数。如果只是打开信号量,把n...翻译 2018-04-24 22:02:22 · 1636 阅读 · 0 评论 -
进程间同步之mutex锁
进制间同步机制之mutex1. Mutex锁可以用于进程间互斥? 当然可以。a) 使用pthread_mutex_t 来实现进程间的互斥。b) 当必须支持PTHREAD_PROCESS_SHARED属性c)其中设置共享对象的属性为PTHREAD_PROCESS_SHARED是为了告诉系统该共享对象是跨越进程的,不仅仅对创建它的进程可见;但是仅有这一个条件显然无法满足不同进程使用该...原创 2018-04-23 22:13:33 · 3176 阅读 · 2 评论 -
进程间通信之信号
1. 信号是进程间通信的一种机制。信号可以在进程任何状态下发送。如果一个信号被进程阻塞,则信号的传递被延迟,直到阻塞被取消时才被传递给进程。2. 信号也属于一种模仿软中断机制,是一种异步通信方式,信号可以在用户空间进程和内核之间直接交互。内核可以利用信号来通知用户空间的进程发生了哪些事件。3. 信号事件有两种来源:按键触发的事件与使用系统调用或者命令发出的信号。4. 进程对信号一般有三...原创 2018-04-18 22:26:03 · 284 阅读 · 0 评论 -
进程通信之共享内存
进程通信之共享内存1. 共享内存共有两种方式:a) 内存映射 : 用于具有亲缘关系的进程中。b) 共享内存机制: 不局限于父子进程,与消息队列。内核维护一段内存。用于共享内存。2.采用共享内存有什么好处?a) 共享内存进行通信效率高。因为进程可以直接读写内存,而不需要任何数据的拷贝。且共享内存只需要拷贝两次,一次从输入文件到共享区,另一次从共享内存到文件。而像消息队列这种方式,...原创 2018-04-17 22:48:21 · 281 阅读 · 0 评论 -
进程间通信之消息队列
进程间通信之消息队列1. 消息队列:就是一个消息的链表,是一系列保存在内核中的消息的列表。用户进程可以队列添加消息,也可以向消息队列读取消息。2. 消息队列与管道通信相比。其优势是可以对每个消息指定类型,接收的时候可以按照次序来接收,而是按照特定消息类型来接收。3. 进程间通过消息队列通信:创建或打开消息队列。添加/删除和控制消息队列。 进程间的消息队列,不局限于父子进程,可以...翻译 2018-04-16 23:28:20 · 152 阅读 · 0 评论 -
popen 的使用方法及场景
Popen的使用方法1.Popen的应用场景popen应用于执行shell命令,并读取此命令的返值,或者与执行的命令进行交互。2.Popen的实现Popen()函数通过创建一个管道,调用fork()产生一个子进程,然后调用execl("/bin/sh", "sh", "-c”,command,0);执行shell命令。可以通过这个管道进行标准输入输出操作,下面会附上源码。3.P...原创 2018-04-16 22:34:53 · 10259 阅读 · 0 评论 -
进程间通信之管道
进程间常见的通信方式之管道1. 匿名管道pipe: 管道是一种半双工的通信方式,数据只能单向流动。一般会创建两个管道使其变为全双工,这个只能在具有亲缘关系的进程间使用,通常的父子进程之间。举例:intmain(int argc, char *argv[]){ int pipefd[2]; pid_t cpid; char buf; if (arg...原创 2018-04-09 22:59:22 · 178 阅读 · 0 评论 -
Linux fork解释
Linux fork解释1. Fork底层实现机制Linux中实现为调用clone函数,然后再调用do_fork(),接着调用copy_process()复制进程(复制父进程的调用栈、thread_info、task_struct等),然后设置子进程描述符内一些成员初始值,然后设置子进程为阻塞态,分配pid,拷贝其他信息如:打开的文件描述符、管道及文件系统信息。2. 所有进程被存放在一...翻译 2018-04-08 22:37:09 · 359 阅读 · 0 评论 -
关于time相关
Reference: http://net.pku.edu.cn/~yhf/linux_c/function/04.htmlasctime(将时间和日期以字符串格式表示) 相关函数 time,ctime,gmtime,localtime 表头文件 #include 定义函数 char * asctime(const struct tm * timeptr); 函数说...转载 2018-03-07 16:51:35 · 163 阅读 · 0 评论 -
关于多线程编程 同步、互斥、读写问题的链接
http://www.linuxidc.com/Linux/2013-09/89931.htm转载 2018-02-08 10:36:40 · 365 阅读 · 0 评论 -
C语言 算术左移、右移和逻辑左移、右移
下面有几个是注意的地方:1. 不管是算术左右移和逻辑左右移,最好是unsigned类型,因为这样算术与逻辑是一样的结果。2. C编译器,默认是算术移位,如是signed类型,这一点一定要把握好。3. 编程过程中,一定要注意右移操作,注意signed 和unsigned的区别。...原创 2017-02-06 11:05:48 · 3064 阅读 · 0 评论 -
C语言 算术左移、右移和逻辑左移、右移
下面有几个是注意的地方:1. 不管是算术左右移和逻辑左右移,最好是unsigned类型,因为这样算术与逻辑是一样的结果。2. C编译器,默认是算术移位,如是signed类型,这一点一定要把握好。3. 编程过程中,一定要注意右移操作,注意signed 和unsigned的区别。...原创 2018-12-17 15:45:53 · 2963 阅读 · 0 评论 -
posix timer 应用
以应用实例解释timer用法#include <stdio.h>#include <stdlib.h>#include <string.h>#include <signal.h> #include <time.h>#include <sys/types.h>#include <pthread.h>原创 2018-12-17 15:46:18 · 331 阅读 · 0 评论 -
proc fs modules
导出内核信息到procproc_test.c 源码#include #include #include #include static int proc_test_show(struct seq_file *m, void *v){ seq_printf(m, "proc test :%s\n", "hell world !");}static int proc_test原创 2017-01-03 16:21:37 · 335 阅读 · 0 评论 -
欢迎使用CSDN-markdown编辑器
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl原创 2016-11-28 15:20:24 · 204 阅读 · 0 评论 -
define 的一个用法
!!!!!今天遇到一个define 的用法,所以随手记录下来 1 #include <stdio.h> 2 #include <linux/kernel.h> 3 4 #define name_s name_size 5 6 struct tt{ 7 int name_size; 8 int size; ...原创 2016-11-28 15:22:35 · 432 阅读 · 0 评论 -
#ifdef 如何实现“与或”
一个条件ifdef A...............endif多个条件 与if ((defined A) && (defined B) && ..).........endif多个条件或if ((defined A) || (defined B) || ..).........endif原创 2016-08-09 17:53:07 · 15897 阅读 · 0 评论 -
c++ 需要用拷贝构造函数的情况
1,明确表示由一个对象初始化另一个对象。2,当对象作为实参传递给函数形参时。3,当对象作为函数的返回值,创建一个临时对象时。原创 2016-06-14 21:45:50 · 477 阅读 · 0 评论