C/C++
文章平均质量分 53
spkettas
天道酬勤
展开
-
Linux 进程隐藏
一. 说明windows下驱动可通过 Hook ZwQuerySystemInformation() 达到隐藏进程的目的,那么linux上如何实现该功能呢。 二. 原理Linux下有大量的进程监控命令,ps,top,htop,lsof 都可以显示资源占用情况。sudo sysdig proc.name=ps1489 14:39:30.258670474 1 ps ...原创 2017-03-14 08:53:27 · 920 阅读 · 0 评论 -
dup,dup2用法
dup,dup2,dup3是linux下非常重要的函数,用来实现流的重定向,可以很方便实现一些很有趣的效果。 原理:每个进程在内核中有相应的fd记录表,每个fd占用一项。调用dup()后,新产生的newfd与原oldfd指向同一内核文件表项,操作newfd与操作oldfd效果一样,比较常用的应用就是CGI编程。 详细描述见:http://www.cnblogs.com/G...原创 2014-11-24 16:39:27 · 195 阅读 · 0 评论 -
1970年至今秒数转化为时间
当前系统时间,一般取自1970年以来秒数值(int),各种编程语言提供API处理方式不同,特汇总。 1.C/C++time_t seconds;time(&seconds); 2.QTQDateTime dt = QDateTime::currentDateTime();dt.toTime_t(); 3.C#C#没有直接提供获取1970年秒值...原创 2016-01-06 11:00:37 · 9907 阅读 · 0 评论 -
linux C正则表达式
标准c/c++不支持正则表达式,但linux下内置正则表达式处理,相对java的Pattern而言,处理比较繁琐。 #include <regex.h>/** *@brief 正则表达式测试 */void reg_test(){ const char *name = "jmA1234kettas"; const char *pa...原创 2014-11-20 16:20:47 · 288 阅读 · 0 评论 -
64位网络字节函数
网络开发经常会遇到网络字节与主机字节顺序转换的问题,网络传输采用大端序方式,现代OS大多采用的小端序方式,需要转换。linux提供了htonl(),htons(),ntohl(),ntohs()4个函数处理16,32位整数的转换,没有提供64位整数的转换。 思路:既然系统提供了32位整数的转换,可以将64位整数拆分成两个32位转换后,移位做与操作即可 ...原创 2014-11-06 12:28:37 · 235 阅读 · 0 评论 -
makefile 字符串分隔
makefile中提供了字符串查找,替换函数,却没有提供字符串分隔函数,可以通过shell表达式解决。 TEST=1.8.2MajorVer = $(shell $(TEST) | awk -F'.' '{print $$1}')注:上例中$$VAR就是获取shell中的变量,而$(VAR)是Makefile的中的变量,否则无法分割...原创 2015-12-09 17:56:32 · 2956 阅读 · 0 评论 -
代码技巧
1. 数据交换不借助第三方变量实现对两个数字的交换。void swap( int *a,int *b ){*a ^= *b ^= *a ^= *b;// 两两取反} 2.char[0]内核中,常见char[0]结构体字段的声明。struct MyData { int nLen; char data[0];// 不占空间}; ...原创 2016-10-31 19:52:24 · 89 阅读 · 0 评论 -
readline 命令补全
readline是linux下常用的CLI交互式开源库,readline可以实现命令编辑,自动命令补全,历史命令搜索等人性化的交互方式。系统实现了rl_filename_completion_function和rl_username_completion_function自动补全,实现自定义命令的自动补全需要实现rl_attemped_completion_function函数。...原创 2015-10-27 16:48:15 · 1047 阅读 · 1 评论 -
select用法
select用法 select为linux常用的非堵塞套接字API,原型为:int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); select用于检测文件描述符的变化,参数五timeout:1....原创 2015-10-27 15:18:10 · 116 阅读 · 0 评论 -
无法收到redis订阅消息
现网程序运行一段时间后,经常发现收不到redis订阅消息。输入client list查询redis连接信息,输出如下信息:id=2375018 addr=120.15.207.135:9159 fd=663 name=subarea age=3324 idle=563 flags=N db=0 sub=0 psub=1 multi=-1 qbuf=0 qbuf-free=0 obl...原创 2016-08-07 15:47:01 · 6385 阅读 · 1 评论 -
SendMessage 传递 CString
1. CString作为参数传递MFC编程中,CString可以直接作为SendMessage()参数来传递。推荐用阻塞方式发送消息,这样能防止CString被析构,而引起内存访问错误。 CString str = _T("hello"); // 发送端SendMessage( m_pPhoneWnd->GetSafeHwnd(),MY_MSG,(WPARAM...原创 2016-06-18 16:48:55 · 762 阅读 · 0 评论 -
Linux 信号量
需求:如何实现fork()后的子进程退出后,再退出父进程 #include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <unistd.h>#include <stdio.h>#include <stdlib...原创 2014-09-09 23:05:17 · 84 阅读 · 0 评论 -
hash_map erase
一. hash_map 使用STL标准库时,如不了解其实现细节,很容易写出错误的代码。常见操作如遍历容器时时同时删除元素,见代码:#include <ext/hash_map>using namespace __gnu_cxx; // linux使用hash_map必须使用该命名空间hash_map<int,Person*> ...原创 2015-05-24 22:53:19 · 1083 阅读 · 0 评论 -
volatile关键字
volatile是c/c++中的关键字,主要作用就是抑止编译器的缓存优化,变量不从register中读取,提醒编译器每次从地址中读取变量。 一.适用环境1、中断服务程序中修改的供其它程序检测的变量需要加volatile;2、多任务环境下各任务间共享的标志应该加volatile;3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义; ...原创 2015-03-15 11:55:13 · 69 阅读 · 0 评论 -
CPU Affinity
CPU亲和性是linux 2.6后出现的新功能,在多核环境下,能将进程或线程绑定到指定的CPU上,减少多进程或线程切换引起处理器的频繁迁移带来的性能损耗。DPDK是Intel提供的高性能网络包采集库,能支持千兆万兆网卡数据采集,原因是其实现用到了CPU affinity,大内存管理,环形缓冲区等技术。将采集线程绑定不同的CPU上,避免线程在不同核上的切换,提高采集效率。 一. 测试...原创 2015-03-15 11:31:17 · 221 阅读 · 0 评论 -
QProcess 启动外部程序
1. 堵塞运行QProcess process;process.execute( "sub.exe", params ); process.waitForFinished(); execute 方法以堵塞方式执行程序,直到程序退出。 2. 异步运行process.start( "sub.exe", params );start 方法单独启动一个进程,hdbwrit...原创 2017-01-06 23:19:21 · 5983 阅读 · 0 评论 -
内存分配出错
最近遇到一个非常有意思的bug,程序总是在 list.push_back() 这行崩溃。代码如下: // 初始化线程池 void init_threads( int m_thread_number ){ thread_t *m_threads; m_threads = new pthread_t(m_thread_number); asser...原创 2014-12-08 16:37:45 · 275 阅读 · 0 评论 -
crtp
C++ 中可通过虚函数实现运行时多态,还可以实现更高效的静态多态。 通过把派生类作为基类的模板参数来实现,该方式称为CRTP(Curious Recurring Template Pattern)。#include <iostream>using namespace std;// 中间类template <class T>class...原创 2018-07-01 13:38:39 · 595 阅读 · 0 评论 -
STL ++iter与iter++区别
之前编码一直用的是iter++,同事说该方式效率比较低。带着疑惑看STL源码: // vector_Myiter& operator++() { // preincrement ++*(_Mybase *)this; return (*this); }_Myiter operator++(int) { // postincrement...原创 2018-06-20 11:05:29 · 966 阅读 · 0 评论 -
C++ 对象内存模型
面试中经常遇到类似多态,虚继承,RTTI,dynamic_cast实现原理之类的问题,这块需要对C++底层内存模型比较理解。C++由于没有存储对象元信息(java反射基础),要支持多态,多继承特性,导致C++对象内存模型异常复杂。 一. 继承内存模型 1. 基类struct B{ long b; virtual void foo(){} ...原创 2018-06-15 11:19:02 · 535 阅读 · 0 评论 -
设计模式之装饰器模式
最近看到《设计之禅》的装饰器模式,特用C++实现了一遍,发现有些有意思的东西需要探究一下。UML类图: 一. C++实现#include <stdio.h>/// Baseclass Component{public: virtual ~Component(){} virtual int operate() = 0;};...原创 2018-05-16 17:51:49 · 203 阅读 · 0 评论 -
原子操作
一. Java volatilevolatile关键字可保证变量可见性,但是无法保证原子性,下面演示多线程修改共享变量Count场景。/** * 共享变量在多线程下修改测试 */public class NonAtomicTest extends Thread { public static volatile int count = 0; pub...原创 2018-05-15 14:29:21 · 148 阅读 · 0 评论 -
C++符号解析
C++ 符号还原(Demangling),windows/linux平台需分别处理。 #include <typeinfo>#include <cxxabi.h>class Foo{};#ifndef __GNUC__ // vcconst char *real_name = typeid(Foo*[10]).name(); ...原创 2018-04-07 22:20:47 · 622 阅读 · 0 评论 -
C/C++ 浮点数存储
IEEE浮点数标准定义了两种基本的格式:以4个字节表示单精度格式和8个字节表示双精度。一. 存储规则float:1位符号数 8位指数 23位有效数0/1 bias:127double:1位符号数 11位指数 52位有效数0/1 bias:10231.1 8.25存储分析(8.25)10 = (1000.01)2划分三部分:1...原创 2017-12-08 21:59:33 · 655 阅读 · 0 评论 -
Cookie设置
一. 比较document.cookie = "a=b; max-age=3600; path=/;";Set-Cookie: a=b; max-age=3600; path=/; 第一种是在客户端通过js设置,随请求传递至服务端,php可通过$_COOKIE获取。第二种是在服务端设置,通过在http头部添加多个Set-Cookie字段实现。 二. 语...原创 2017-10-11 10:52:31 · 168 阅读 · 0 评论 -
DES加密
DES 对称加密方式,在通信过程中经常用到。DES有四种加密模式: 1. ECBElectronic Codebook最古老简单的模式,加密数据长度必须为8的倍数(不足8位添加padding),密钥必须为8位。不依赖向量,易受到字典攻击。不推荐。2. CBCCipher Block Chaining引入初始化vector,可以使用不同的Vector产生不同的密文。缺...原创 2017-01-25 10:13:09 · 317 阅读 · 0 评论 -
流量劫持
流量劫持比较复杂,一般来说运营商,路由器厂商,黑客都可能是流量劫持操作者。基于国内大部分网站以http明文协议为主,这无疑给劫持者提供了土壤。本文演示了家庭路由器流量劫持实现,公共WIFI连接授权实现有点差异,它是用iptables重定向至webserver,有兴趣的同学可参考nodogsplash实现源码。一. 原理图原理:1. 嗅探用户http ge...原创 2017-07-13 12:36:15 · 1414 阅读 · 0 评论 -
VS2012 开发驱动
VS12下开发wdk驱动,比较繁琐,要设置很多选项。本文在 win8 + visual studio2012 + wdk7600 下测试通过。 一. 项目属性配置常规 目标文件扩展名:.sys // 必选 VC++目录 包含目录 C:\WinDDK\7600.16385.1\inc\wdf\kmdf\1.9 inc\ddk inc...原创 2016-04-01 11:03:15 · 554 阅读 · 0 评论 -
基于http的protobuf服务实现
通常webapi实现通过http get/post请求,返回文本型的json,xml等字符串。本文以Tomcat8为web服务器,借助protobuf框架,响应二进制数据。由于protobuf协议能跨语言,我们可以用java servlet实现服务端,C/C++实现客户端,达到各模块解耦目的。双方需设置ContentType为application/x-protobuf。 1...原创 2017-05-28 10:34:35 · 3906 阅读 · 0 评论 -
protobuf 格式分析
protobuf 是谷歌出品一款高性能序列化框架,优点序列化后报文数据小,支持多种多种编程语言(c/c++,java,php,python等主流语言),缺点二进制不可读这倒不重要。 一. 安装下载源码编译 二. 开发流程2.1 准备helloworld.proto文件package com;message helloworld{ requir...原创 2017-05-27 15:19:19 · 607 阅读 · 0 评论 -
gcc 有趣语法
最近做linux下开发,发现一些莫名其妙的语法,记录之。 一.函数定义 看到很多开源代码,函数定义比较特殊,见下面这种形式:int add(a,b)int a;int b;{ return a+b;} 参数类型不放在括号内,反而单独提出来定义,第一次见到这样的写法,刚开始我模仿这种形式代码,折腾了半天也没编译过去。后来发现这种...原创 2014-12-11 22:30:21 · 155 阅读 · 0 评论 -
data_seg
#pragma data_seg() 是vc编译器提供的预处理指令,可以实现进程间数据共享。一般用于DLL中,且数据必须初始化,否则编译器会把未初始化数据放到.BSS段中 #pragma data_seg("MySection")int nSize = 10; // 必须初始化#pragma data_seg()#pragma comment(li...原创 2014-08-21 12:58:18 · 183 阅读 · 0 评论 -
Linux select/epoll网络模型
select,epoll网络模型经常在面试中出现,epoll是对poll的优化,是linux下最优秀的网络模型epoll优点:# 相对select,没有最大并发数限制 /proc/sys/file-max# 数据传递(用户空间跟内核空间)通过共享内存(mmap)方式# epoll_wait 直接返回被触发的fd对应的一块buffer,不需要遍历所有的fd 一.Linux...原创 2014-08-19 16:33:12 · 110 阅读 · 0 评论 -
zpipe.c 的使用
zlib压缩性能非常优良,能将数百M文件压缩到几十M, 从官网下载zpipe.c示例代码,可以直接拿过来用. 编译zpipe.c后使用: zpipe -d <file.hdb> file.hdb.z 控制台接收输入文件参数. 修改让其直接操作文件:int main(int argc, char **argv){ int ret; int ...原创 2013-07-18 17:27:54 · 545 阅读 · 0 评论 -
One or more breakpoints cannot be set and have been disabled.
有时在用VC6调试过程中,老遇到这个讨厌的提示"One or more breakpoints cannot be set and have been disabled",然后就跑到第一行去执行了. 看网上大多都是在设置中删除所有断点, 然后再重新设置新断点. 照做了一下,还是不能解决问题, 直到重新编译了程序(依赖库dll)才解决了问题. 这是因为本工程调用的dll太过了陈旧...原创 2012-09-20 17:00:01 · 217 阅读 · 0 评论 -
vc6无法调用BroadcastSystemMessage
VC6里调用系统API广播消息,编译报错: error C2065: 'BroadcastSystemMessage' : undeclared identifier! 但是在VS08下编译一切正常. 在winuser.h 里面添加调试宏(#error test),发现 __WIN32_WINNT 宏没有定义, 看来VC6太out了,系统API都不支持了,解决方案在wind...原创 2012-12-29 11:32:02 · 111 阅读 · 0 评论 -
C++ 妙用virtual 回调子类方法
C++中关键字virtual主要用于多态,子类重写父类方法,从而提供更灵活的实现逻辑. 在QT里面,我们经常会继承QWidget, 然后在子类中重写mouseMoveEvent()这些事件,当鼠标移动时系统执行子类方法逻辑,一直都很纳闷这是怎么实现的, 如何将子类函数指针传入到父类, 当相应事件发生时,进而执行子类鼠标移动方法. 1. virtual的基础用法 //...原创 2012-12-28 16:49:45 · 444 阅读 · 0 评论 -
Linux 共享内存
Linux下共享内存有mmap和System V两种方式 1.mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。由此看来mmap并不纯粹是为实现共享内存而设计的 2.System V 共享内存是通过映射特殊文件系统 shm 中的文件...原创 2012-12-24 17:17:22 · 97 阅读 · 0 评论 -
进程间通信 --linux篇
linux 下进程间通信就简单多了, 可以采用信号方式. 1. kill 方式 int kill(pid_t pid,int sig), 当pid=-1 将信号广播传送给系统内所有的进程,在Redhat下测试发现, kill -1 SIGRTMIN+10, 只能广播系统关闭命令,关闭所有的用户进程; 因此此路不通,只能一个一个进程的发送信号. 2. ...原创 2012-12-24 16:59:34 · 114 阅读 · 0 评论 -
进程间通信 --windows篇
需求如下: 当配置文件发生改变时,广播配置信息给所有的进程,通知其重装配置. 1. WM_COPYDATA传递消息 windows下最简单进程通信方式,利用WM_COPYDATA事件, 该事件能够传递一指针来携带消息. // 查找标题为Sample的窗口,向其发送一字符串HWND hWnd = FindWindowW(NULL, "Sample");...原创 2012-12-24 16:27:32 · 312 阅读 · 0 评论