Linux C/C++
xpple
linux软件开发
展开
-
通用队列编程设计
我们在设计队列的时候,如何巧妙的设计一种通用的数据结构来保存各种不同的元数据?比如有数据类型A,数据类型B等等。定义一个Task类class A { char buffer[10]; A(const char* p, int len) { if(len > sizeof(buffer)) { len = sizeof(buffer); } memcpy(buffer, p, le原创 2022-04-28 10:45:42 · 652 阅读 · 0 评论 -
__builtin_expect的作用
将流水线引入cpu,可以提高cpu的效率。更简单的说,让cpu可以预先取出下一条指令,减少cpu等待取指令的耗时,从而可以提供cpu的效率。如果存在跳转指令,那么预先取出的指令就无用了。cpu在执行当前指令时,从内存中取出了当前指令的下一条指令。执行完当前指令后,cpu发现不是要执行下一条指令,而是执行offset偏移处的指令。cpu只能重新从内存中取出offset偏移处的指令。因此,跳转指令会降低流水线的效率,也就是降低cpu的效率。综上,在写程序时应该尽量避免跳转语句。那么如何避免跳转语句呢?答原创 2022-04-19 10:15:37 · 197 阅读 · 0 评论 -
CAS操作
1. CAS原理2. CAS缺点,ABA问题GCC的CAS,GCC4.1+版本中支持CAS的原子操作。1)bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval, ...) 2)type __sync_val_compare_and_swap (type *ptr, type oldval, type newval, ...)C++11中的CAS,C++11中的STL中的atomic类的函数可以让你原创 2022-03-28 10:51:34 · 442 阅读 · 0 评论 -
boost Turtle篇
出自http://turtle.sourceforge.net/turtle/motivation.htmlimplements based class function实现函数重载:MOCK_BASE_CLASS( mock_view, view ) // declare a 'mock_view' class implementing 'view'{ MOCK_METHOD( display, 1 ) // implement the 'display' method f.原创 2020-08-15 17:45:38 · 254 阅读 · 0 评论 -
c++知识点补充
函数对象和普通函数的区别原创 2020-08-11 16:15:35 · 99 阅读 · 0 评论 -
工厂模式boost::factory
#ifndef MP_OBJECT_FACTORY_H #define MP_OBJECT_FACTORY_H #include <boost/function.hpp> #include <map> /// 工厂模式泛型实现. /// 限制: 生成的对象必须为通过默认构造函数来构造. /// 当然你也可以扩展这个模板让它支持更多参数的构造函数. template<typename IdType, typename ObjectType>.转载 2020-08-11 16:03:16 · 1134 阅读 · 0 评论 -
PGM可靠组播协议
PGM,Pragmatic General Multicast(RFC 3208)。基于IP层的传输层协议,与TCP/UDP同级。开源工程OpenPGM,https://www.developerfusion.com/project/66770/openpgm/原创 2020-06-29 11:22:35 · 2508 阅读 · 0 评论 -
C++11 字符串分割
Using explode function as it used in PHP programming.The code above just a simple function, yet well-tested with various case. Following is the example in main function: int main(){ string str{"the quick brown fox jumps over the lazy dog...原创 2020-06-28 16:36:58 · 1291 阅读 · 0 评论 -
c++右值引用
rvalue reference lets you modify the value of a temporary object: std::string s1 = "Hello "; std::string s2 = "world"; std::string&& s_rref = s1 + s2; // the result of s...原创 2020-03-18 15:22:05 · 104 阅读 · 0 评论 -
linux core文件调试程序
首先程序编译必须带-g ulimit -c unlimited原创 2014-10-23 17:14:56 · 416 阅读 · 0 评论 -
man 5 proc
# man 5 proc/proc/sys/fs/file-max This file defines a system-wide limit on the number of open files for all processes. (See alsosetrlimit(2), which can be原创 2016-09-12 11:03:40 · 727 阅读 · 0 评论 -
linux gdb调试程序 - 信号
http://blog.csdn.net/yuyunliuhen/article/details/41673599原创 2015-12-16 20:32:22 · 595 阅读 · 0 评论 -
几种IO模型
转自:http://blog.csdn.net/historyasamirror/article/details/5778378当你发现自己最受欢迎的一篇blog其实大错特错时,这绝对不是一件让人愉悦的事。《 IO - 同步,异步,阻塞,非阻塞 》是我在开始学习epoll和libevent的时候写的,主要的思路来自于文中的那篇link 。写完之后发现很多人都很喜欢,我还是非常开心的转载 2016-10-10 10:19:53 · 275 阅读 · 0 评论 -
sigsetjmp函数
相关函数:longjmp, siglongjmp, setjmp 表头文件:#include 函数定义:int sigsetjmp(sigjmp_buf env, int savesigs) 函数说明:sigsetjmp()会保存目前堆栈环境,然后将目前的地址作一个记号,而在程序其他地方调用siglongjmp()时便会直接跳到这个记号位置,然后还原堆栈,继续程序的执行。 参转载 2016-09-30 10:17:51 · 611 阅读 · 0 评论 -
linux文件锁-续篇
来自文摘: http://www.gnu.org/software/libc/manual/html_node/File-Locks.html 概要如下:1. fcntl函数用来支持记录锁(recording locking), 防止多个进程同时对一个文件地某些部分访问造成错误。 锁分为共享锁和互斥锁两种。2. read、write函数不检查文件的锁情况(fread,fwrit原创 2017-02-07 17:48:53 · 344 阅读 · 0 评论 -
linux文件锁
flock和lockf从底层的实现来说,Linux的文件锁主要有两种:flock和lockf。需要额外对lockf说明的是,它只是fcntl系统调用的一个封装。从使用角度讲,lockf或fcntl实现了更细粒度文件锁,即:记录锁。我们可以使用lockf或fcntl对文件的部分字节上锁,���flock只能对整个文件加锁。这两种文件锁是从历史上不同的标准中起源的,flock来自BSD而lockf原创 2017-02-07 16:13:03 · 1280 阅读 · 0 评论 -
散列表 - Hash Table
源自>散列算法key table size原创 2017-02-20 16:37:46 · 328 阅读 · 0 评论 -
内存池技术
原文:https://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html利用默认的内存管理函数new/delete或malloc/free在堆上分配和释放内存会有一些额外的开销。转载 2017-04-25 16:36:38 · 274 阅读 · 0 评论 -
C语言 冒泡排序和二分查找
#include #include int a[] = {11,2,3,44,58,16,7,8,9,10};//冒泡排序int order_main(){ int i,j; int n = sizeof(a)/sizeof(int); int tmp; for(i=n-1;i>0;i--)原创 2016-07-15 09:24:43 · 779 阅读 · 0 评论 -
冒泡排序、二分查找、单向链表操作
#include #include #include int a[] = {11,2,3,44,58,16,7,8,9,10};//int a[] = {11,2,3,4,5,6,7,8,9,10};//冒泡排序int bubble_sort(int a[],int n){ int i,j; int tmp; for(i原创 2017-09-15 18:29:23 · 374 阅读 · 0 评论 -
如何从数组中找出两个数,使得其之和等于某个值
原创 2018-01-16 19:07:50 · 1502 阅读 · 0 评论 -
一个二分查找树的实现
源自c++数据结构与算法一书#include <iostream>using namespace std;template<class Comparable>class BinarySearchTree{ public: BinarySearchTree(){ root = NULL; } ...原创 2018-02-26 18:04:57 · 367 阅读 · 0 评论 -
深度优先搜索和广度优先搜索
#include <iostream>#include <stack>#include <queue>using namespace std;struct BitNode{ int data; BitNode *left, *right; BitNode(int x) :data(x), left(0), right(0...转载 2018-03-01 15:36:20 · 261 阅读 · 0 评论 -
priority_queue指定模板参数
#include<queue>#include<iostream>using namespace std;struct mytype{ int x;};struct comp{ bool operator()(mytype a, mytype b) { return a...原创 2018-02-24 16:48:22 · 1056 阅读 · 0 评论 -
c++之protected
通过一个列子来说明protected属性#include <iostream>using namespace std;class A { protected: int p;};class B : public A{ public: void set(int i) ...原创 2018-05-30 10:59:45 · 648 阅读 · 0 评论 -
乒乓结构缓冲存储
乒乓结构缓冲存储乒乓结构:先来说说使用它的背景:本次项目中,我被分配的任务是从外部获取视频数据送入nios中,然而外部的SDAM已经没有空间存储,仅仅有一小块RAM可以应用,这种情况下,就是用了乒乓结构。下面来介绍下乒乓缓存控制原理“乒乓操作"是一个常用的数据流控制处理技巧。典型的乒乓操作结构如图6所示。乒乓操作的处理转载 2012-08-07 01:45:11 · 21369 阅读 · 2 评论 -
kill及kill -9的用法及如何实现进程的优雅退出
kill pid与kill -9 pid的区别 kill pid的作用是向进程号为pid的进程发送SIGTERM(这是kill默认发送的信号),该信号是一个结束进程的信号且可以被应用程序捕获。若应用程序没有捕获并响应该信号的逻辑代码,则该信号的默认动作是kill掉进程。这是终止指定进程的推荐做法。 kill -9 pid则是向进程号为pid的进程发转载 2015-10-27 17:38:18 · 10129 阅读 · 0 评论 -
TCP粘包解决方案 - 环形缓冲区
粘包产生原因:先说TCP:由于TCP协议本身的机制(面向连接的可靠地协议-三次握手机制)客户端与服务器会维持一个连接(Channel),数据在连接不断开的情况下,可以持续不断地将多个数据包发往服务器,但是如果发送的网络数据包太小,那么他本身会启用Nagle算法(可配置是否启用)对较小的数据包进行合并(基于此,TCP的网络延迟要UDP的高些)然后再发送(超时或者包大小足够)。那么这样的话,服转载 2015-11-13 17:51:12 · 2836 阅读 · 0 评论 -
linux可变参数之宏函数
#ifdef _C99 //C99编译器#define d_log(...) printf(__VA_ARGS__)#else //GNU C编译器#define d_log(format, arg...) printf(format, ##arg)#endifconst char *str = "hello wrold";d_log("string = %s原创 2012-09-15 11:47:56 · 580 阅读 · 0 评论 -
pthread_cond_wait()
了解 pthread_cond_wait() 的作用非常重要 -- 它是 POSIX 线程信号发送系统的核心,也是最难以理解的部分。 首先,让我们考虑以下情况:线程为查看已链接列表而锁定了互斥对象,然而该列表恰巧是空的。这一特定线程什么也干不了 -- 其设计意图是从列表中除去节点,但是现在却没有节点。因此,它只能:锁定互斥对象时,线程将调用 pthread_cond_wait(原创 2012-09-12 17:31:37 · 310 阅读 · 0 评论 -
string.h的其他函数
char *strsep(char **stringp, const char *delim); 功能:分解字符串为一组字符串。从stringp指向的位置起向后扫描,遇到delim指向位置的字符后,将此字符替换为NULL,返回stringp指向的地址 long int strtol(const char *nptr, char **endptr, int base)功能:str原创 2012-07-30 16:55:43 · 519 阅读 · 0 评论 -
volatile 详解
我在开发中也常常遇到这个问题, 发现通常用在两个方面, 一方面是对硬件寄存器或固定内 存的访问,一般要用到,这就是我们常常在寄存器的头文件常常看到的,另一个就是在多线 程,或主程序和中断共享,全局变量常常用到。言归正传,看看老外是怎么说的: Introduction to the Volatile Keyword 认识关键字 Volatile The use of volatile is原创 2012-07-28 00:07:47 · 2033 阅读 · 0 评论 -
malloc(0)
先不费口舌了,看代码和运行结果吧:#include #include #include int main(){ char* p = NULL; p = malloc(0); if(NULL == p) { printf("get a invalid point!\n");原创 2012-08-09 20:52:33 · 700 阅读 · 0 评论 -
基于FPGA的多通道数据采集系统设计
时间:2009-10-23 09:27:29 来源:微计算机信息 作者:刘小林 范育兵 罗春晖大地电磁场携带着地球内部的结构、构造、温度、压力以及物质成分的物理状态等信息,为人们研究板块运动的规律、追溯地球的演化历史提供了科学依据。大地电磁探测是研究大陆岩石圈导电性结构的有效方法之一,使人们从电性角度认识地球内部的构造形态,达到了解地下不同深度地质情况的目的。该技术应用前景广泛,可用于地下转载 2012-08-07 01:53:31 · 10234 阅读 · 5 评论 -
怎么依次取到一个整数的各个位?
test(int i){ int j ; while(1) { j = i%10;//取到最低位(余数) i= i/10;//右移一位 printf("%d\n",j); if(i == 0)原创 2012-07-02 21:45:06 · 4265 阅读 · 0 评论 -
关于宏定义的形式
1.#define DUMP_WRITE(addr,nr) memcpy(bufp,addr,nr); bufp += nr;2.#define DUMP_WRITE(addr,nr) {memcpy(bufp,addr,nr); bufp += nr;}3.#define DUMP_WRITE(addr,nr) do { memcpy(bufp,addr,nr); bufp += nr; } w原创 2012-06-30 01:09:38 · 7385 阅读 · 2 评论 -
c语言变量的内存分配
郁闷,今儿面试吧堆栈的概念弄反了,搞的面试官都禁不住笑。C 语言变量声明内存分配(转) 语言变量声明内存分配( 一个由 c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。 其操作方式类似于数据结构中的栈。程序结束时由编译器自动释放。 2、堆区(heap) — 在内存开辟另一块存储区域。一般由程序员分配释放,原创 2012-07-02 21:11:43 · 748 阅读 · 0 评论 -
进程和线程
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。 上述说法估计看了你也不明白。这里我有更贴切的见解:进程是原创 2012-07-05 12:16:00 · 403 阅读 · 0 评论 -
linux 多进程代码
#include #include #include #define PROCESS_NUM 5pid_t pid;int dosomething(){}int create_process(int num){ while(num > 0) { pid = fork();原创 2012-09-18 22:13:15 · 362 阅读 · 0 评论 -
多进程和多线程比较
通过对比说明:对比维度多进程多线程优势内存、CPU系统需要分配额外的资源。上下文切换复杂,CPU利用率低较小的开销,CPU利用率高线程占优数据共享多进程数据都是相互独立的,需要通过IPC共享数据(如共享内存)。多线程共享程序的全局变量,堆,文件资源等,访问方便。线程占优可靠性多进程间互不影响,一个进程异常挂原创 2015-11-10 23:11:38 · 414 阅读 · 0 评论