自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Linux C/C++后台开发

Talk is cheap. Show me the code!

  • 博客(83)
  • 收藏
  • 关注

原创 源码安装pip

今天本来要使用Twisted,但是公司的编译环境使用的Gentoo,没有yum,apt-get,我每次安装python库都是自己下载源码用python setup.py来编译安装,安装后的库文件在/usr/lib64/python2.7/site-packages目录下,源码安装的在这个目录下库的文件夹名字会带上后缀.egg。最后拷贝库文件到我的运行环境对应目录下面,例如拷贝到了目录/home/t...

2017-11-03 16:50:44 2890

原创 docker -v :rw :ro

先引用官方文档原话:If neither ‘rw’ or ‘ro’ is specified then the volume is mounted in read-write mode.(https://docs.docker.com/engine/reference/run/#volume-shared-filesystems) 官方文档说不指定的时候默认是rw模式。 用docker in

2017-10-31 19:49:49 19276

原创 2>/dev/null和>/dev/null 2>&1和2>&1 >/dev/null

标准输入0    从键盘获得输入 /proc/self/fd/0 标准输出1    输出到屏幕(即控制台) /proc/self/fd/1 错误输出2    输出到屏幕(即控制台) /proc/self/fd/2 /dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞” 1. 2>/dev/null意思就是把错误输出到“黑洞” 2. > /dev/n

2017-10-27 14:38:17 1220

原创 source命令的巧用

首先,通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。例如,当我们修改了/etc/profile文件,并想让它立刻生效,而不用重新登录,就可以使用source命令,如source /etc/profile。 其次,source filepath或者. filepath,sh filepath或者./filepath区别: 1. sh filepath会重新建立一个子she

2017-10-27 12:25:06 1599

原创 python使用原始套接字发送二层包(链路层帧)

发送端代码:#!/usr/bin/python# -*- coding: UTF-8 -*-import socketimport structraw_socket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x1234))raw_socket.bind(("eth0", 0))packet = struc

2017-09-25 10:01:20 6476 2

原创 epoll的ET和LT模式下,accept,recv,send写法

epoll有两种事件模型: Level Triggered (LT) 水平触发 socket接收缓冲区不为空,有数据可读,读事件一直触发 socket发送缓冲区不满,可以继续写入数据,写事件一直触发 Edge Triggered (ET) 边缘触发 socket的接收缓冲区状态变化时触发读事件,即空的接收缓冲区刚接收到数据时触发读事件 socket的发送缓冲区状态变化时触发写事件,即满的

2017-09-22 19:49:45 4751 2

原创 python使用epoll实现的服务端例子

#!/usr/bin/python# -*- coding: UTF-8 -*-import socketimport selectsend_data = "hello world!"send_len = len(send_data)recv_len = 1024tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

2017-09-22 18:58:29 1177

原创 pipework给docker设置ip

pipework下载地址 解压之后,有一个pipework文件,其实就是shell脚本。 1.创建启动一个容器 docker run -it -d –name test_pipework –net=none centos bash 2.给docker设置ip sh -x /usr/bin/pipework br0 test_pipework 192.168.0.12/24@192.168.

2017-08-29 11:51:53 1852

原创 docker registry私有仓库的一些错误解决办法

Error response from daemon: login attempt to https://test.io:5000/v2/ failed with status: 401 Unauthorized 这种情况是用户名或者密码错误导致Error response from daemon: Get https://test.io:5000/v1/users/: x509: certifi

2017-08-12 17:13:08 25282 3

原创 docker registry带ssl认证的私有仓库搭建

1.首先docker pull registry默认下载最新版的镜像,我这边是2.6.2版本 2.这边考虑私有仓库部署的服务器可能没有网络,可以使用docker save -o registry.tar registry:2.6.2保存一个镜像,然后把registry.tar打包到部署包里面,下次使用docker load -i registry.tar加载到本地镜像 3.保证ssl已安装,且/

2017-08-11 19:42:41 4021

原创 linux c使用system调用shell脚本

system的原理其实就是调用fork创建子进程去执行shell命令,然后返回最后一条shell命令的状态值。linux下man system可以看到返回值说明: 1.如果返回值等于-1就是system函数执行失败,准确的说是fork创建子进程失败。 2.shell执行最后一条语句的状态值放在返回值的低8位,使用WEXITSTATUS宏可以获得状态值。 3.使用WIFEXITED宏取返回值判断

2017-08-05 12:48:47 6456

原创 在docker内部创建和启动新的docker

架构师开始给我分配这样一个任务的时候我还以为是嵌套在docker里面创建docker,其实不然,毕竟最后形成的架构,是要创建和启动的docker在一个层级被管理。 这里我们可以看到docker启动之后,会有一个dockerd的守护进程,一个containerd管理进程。注意dockerd进程绑定监听在了/var/run/docker.sock文件上,很明显,docker之间通讯使用的unix_

2017-08-04 21:21:30 3232

原创 struct中的数组和指针

这里可以看出来两点: 1.struct的内存对齐是按照成员最大的那一个来的 2.数组在struct中不占大小 重点说第2个,在linux内核代码中屡见不鲜! 这个用法主要用于变长buffer,test1的大小为4,结构体中的data[0]不占用任何空间,甚至是一个指针的空间都不占,data在这儿只是表示一个常量指针,这个特性是编译器来实现的,即在使用test1.data的时候,这个指针就是表示

2017-08-04 20:56:08 4462 3

原创 udp调用sendmsg报错Invalid argument

最近在写一个udp发送的时候冒出来一个错误,errno等于22,错误描述是Invalid argument,百度之后都是一些关于文件操作的错误,最后还是要靠自己。用strace跟进内核调用过程,也是没看出来什么。 可以看到,sendmsg所有参数完全正确,但是最后就是错误。 这个问题的主要点是对udp执行connect操作!connect并没有进行真正的连接操作(相对于tcp来说),而相当于给对

2017-08-04 10:27:15 8651

原创 Source Insight4.0问题总结

Source Insight4.0.0086下载地址 破解包下载地址 1.代码格式自动对齐问题 Options->File Type Options->Auto Indenting 2.工程新增或者删除文件,函数变量定义跳转找不到 Project->Synchronize Files 直接点击Start会重新解析工程所有文件生成所有函数变量定义跳转映射,如果工程新增了文件,可以勾

2017-07-14 23:59:20 7300

原创 Docker背后的内核知识Linux namespace

Docker引擎的基础是Linux容器技术(Linux Containers,LXC)容器有效地将由单个操作系统管理的资源划分到孤立的组中,以便更好地在孤立的组之间平衡有冲突的资源使用需求。具体体现在6个方面: namespaces Mount CLONE_NEWNS 挂载点(文件系统) UTS CLONE_NEWUTS 主机名与域名 IPC CLONE

2017-06-21 10:37:59 756

原创 TCP连接的建立与终止

先附上正常连接和正常关闭情况下TCP状态变迁图 两个应用程序同时彼此执行主动打开的情况是可能的,尽管发生的可能性极小。TCP特意设计了可以处理同时打开,对于同时打开它仅建立一条连接而不是两条连接。 两个应用程序同时都执行主动关闭也是可能的,TCP协议也允许这样的同时关闭(simultaneous close) TIME_WAIT 1. TIME_WAIT状态也称为2MSL等待状态

2017-04-21 16:26:15 730

原创 从epoll源码分析它的使用

首先来看看epoll_create的真身SYSCALL_DEFINE1(epoll_create, int, size){ if (size <= 0) return -EINVAL; //也就是说参数size根本用不上 return sys_epoll_create1(0);}再来看看epoll_create1的真身SYSCALL_DEFINE1(epoll_c

2017-04-06 15:17:40 1510 1

原创 memcmp比较两个struct是否相等

struct MyStruct{ char a; int b;};MyStruct A, B;memcmp(&A, &B, sizeof(MyStruct));A和B是否可以通过memcmp来判断是否相等。我一直以为虽然要内存对齐,但是a后面会补三个’\0’所以还是可以判断是否相等的。真是迷之自信!这个问题其实最主要是考察你要知道内存对齐,MyStruct的实际大小是8就够了

2017-03-07 16:04:05 9026 2

原创 不定参数函数牵扯出来的栈的生长方向和大端小端模式

主题:CPU的架构决定了大端小端模式和栈的生长方向。 首先参数从右到左压栈的方式,这是C语言决定的,比如说Pascal就是从左到右压栈,所以Pascal不支持不定参数函数。比如:printf("%s%d%d\n", s, a, b);格式字符串是确定存在的,后面的变量都是不确定的或者说不知道有多少个。如果格式字符串最后一个入栈,位于栈顶,第一个出栈然后解析格式字符串得到不定参的个数,挨个出栈,这样

2017-03-06 21:08:32 692

原创 #define MAX(a, b, ……)

用宏定义MAX(a,b)求两个数最大值:#define MAX(a,b) a>b?a:b用宏定义MAX(a,b,c)求三个数最大值:#define MAX(a,b,c) (a>b?(a>c?a:c):(b>c?b:c))用宏定义MAX(a,b,c,d)求四个数最大值:#define MAX(a,b,c,d) (a>b?a:b)>(c>d?c:d)?(a>b?a:b):(c>d?c:d)

2017-03-06 15:46:31 9591 3

原创 线程池的最优大小

计算密集型应用(CPU密集)顾名思义就是应用需要非常多的CPU计算资源,I/O在很短的时间就可以完成,而 CPU 还有许多运算要处理。在计算密集型应用中,线程池的大小应该等同于主机中 CPU 的数量。再添加更多线程将会打断请求的处理,因为线程的上下文切换也会延迟响应时间。非阻塞型 IO 应用将会是 CPU 密集型的,因为在请求得到处理的时候没有线程等待时间。

2017-03-01 17:13:36 3615 1

原创 my.cnf参数配置:InnoDB引擎性能优化

在网上看了无数的my.cnf的配置,大多数提到的配置无外乎这几个: 1. innodb_buffer_pool_size 2. innodb_log_file_size 3. innodb_log_buffer_size 4. innodb_flush_log_at_trx_commit 然后自己写了两个例子,一个单线程的,一个多线程的来通过改变配置参数来测试是否提高了性能。结果是只有in

2017-03-01 16:10:00 722

原创 MySQL prepare statement速度的测试思考

最近一直纠结于MySQL预处理API和普通API的速度问题,网上的一致说法都是主张使用预处理API,因为它的SQL语句会提前预编译,后续只要传送参数到MySQL,减少多次调用时编译需要的时间和多次调用需要再次传输SQL的数据量。但是基于这个原理,其实应用场景就是同一条SQL语句需要多次执行的情况下。假如现在的应用场景,每次来了数据,你要通过自己的机制重新计算分表的表名的话,那就必须每次重新初始化st

2017-02-22 21:12:58 1413

原创 MySQL存全角字符和半角字符的区别

很不巧公司内测IM的时候又遇到MYSQL_DATA_TRUNCATED错误,日志记录还是在mysql_stmt_fetch调用的时候出现的。鉴于之前的经验,应该是给定的结果集绑定区域长度不够造成的,反复检查了好多遍没发现问题。我在代码中都是对应的关系,比如char(20),我代码中就会定义char buffer[20]数组来存储。看起来如此的正确完美。后面没办法只好打印每一行的数据,找到报错的那一行

2017-01-16 18:12:58 4730

原创 count(), group by, order by

最近做IM的时候遇到一个问题,同时用到了这三个关键字。就是查询一个人的离线消息详情,我们服务端返回给客户端显示的这个详情包括了三个内容,第一个要求列出离线这段时间哪些人或者群给你发了消息,第二个这其中的某个人或者群发了多少条离线消息,第三个拿出最新的一条显示出来。很明显,group by分组哪些人或者群给你发了离线消息,count()得到离线消息数量,order by时间来排序拿出最新的消息。sel

2017-01-13 20:26:49 1646 6

原创 MySQL连接池的实现

class connect_pool{public: connect_pool(); ~connect_pool();public: MYSQL *get_connection(); int free_connection(MYSQL *mysql);private: int init(string db_server_ip, string user, s

2016-12-30 17:07:25 982

原创 MYSQL_DATA_TRUNCATED

按照MySQL手册的说法,除非用mysql_options()启用了截短通报功能,mysql_stmt_fetch()才会返回MYSQL_DATA_TRUNCATED这个错误。于是我调用mysql_stmt_fetch()的方法:int ret = mysql_stmt_fetch(m_stmt);if (ret == 0){ return 0;}else if (ret == MY

2016-12-29 21:17:22 2328 4

原创 MySQL不重复插入,记录不存在则插入,存在则更新

SQL UNIQUE 约束 UNIQUE 约束唯一标识数据库表中的每条记录。 UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。 PRIMARY KEY 拥有自动定义的 UNIQUE 约束。 请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。 下面的 SQL 在 “Persons” 表创建时在 “Id_P” 列创

2016-12-20 11:31:19 8190

原创 linux环境变量LD_LIBRARY_PATH

在登录Linux时要执行文件的过程如下: 在刚登录Linux时,首先启动 /etc/profile 文件,然后再依次启动用户目录下的 ~/.bash_profile、 ~/.bash_login、~/.profile文件。如果 ~/.bash_profile文件存在的话,一般还会执行 ~/.bashrc文件。因为在 ~/.bash_profile文件中一般会有下面的代码:if [ -f ~/.ba

2016-11-24 20:49:47 1235

原创 MySQL分表存储过程

drop procedure if EXISTS exe_sql;delimiter $CREATE PROCEDURE `exe_sql`(IN sqlVar VARCHAR(4096))BEGIN SET @v_s = sqlVar; PREPARE stmt FROM @v_s; EXECUTE stmt; DEALLOCATE PREPARE stmt;

2016-11-09 17:52:51 1409

原创 libevent多线程使用bufferevent的那些事

void do_accept(struct evconnlistener *listener, evutil_socket_t fd, struct sockaddr *sa, int socklen, void *ctx){ //不使用Nagle算法,选择立即发送数据而不是等待产生更多的数据然后再一次发送 int optval = 1; setsockopt(fd, SO

2016-11-09 17:42:20 8009 12

原创 socket套接字选项和模式

设置非阻塞windows的做法:u_long nonblocking = 1;ioctlsocket(fd, FIONBIO, &nonblocking);linux的做法int flags;flags = fcntl(fd, F_GETFL, NULL);fcntl(fd, F_SETFL, flags | O_NONBLOCK);设置FD_CLOEXECint flags;flag

2016-11-05 17:16:19 1261 8

原创 libevent使用event事件触发服务端实例

struct event_base* m_base = event_base_new();if (NULL == m_base){ return 1;}首先是创建base,后面的event都是基于base,关联到base才能进入循环。struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr

2016-11-05 17:03:37 2535

原创 protobuf使用方法

#!/bin/shSRC_DIR=./protocolDST_DIR=./cpp#C++protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/*.proto这是编译*.proto文件的脚本 这里我们用proto_class代替*.proto文件中的类结构 1.解析问题 char *str_buffer = new char[length]; pr

2016-10-10 09:54:22 3056

原创 MySQL C API预处理函数call存储过程

drop procedure if exists SelectAll;delimiter $create procedure SelectAll(in TableName char(64))begin set @sql = 'select * from ?'; prepare stmt from @sql; set @p = TableName; execute

2016-10-09 14:34:11 2206

原创 C++封装MySQL预处理C API

#ifndef _PRE_STATEMENT_H_#define _PRE_STATEMENT_H_#include "mysql.h"#include class pre_statement{public: pre_statement(); ~pre_statement(); int init(MYSQL* mysql, string& sql); int set_pa

2016-08-04 14:00:19 4155 16

原创 跨平台的线程封装类

#ifdef WIN32#include #include #else#include #endif/*#ifdef WIN32typedef unsigned int(__stdcall *thread_func)(void*);#elsetypedef void*(*thread_func)(void*);#endif*/class base_thread{p

2016-07-29 15:58:54 3167 3

原创 Linux互斥锁和条件变量

#include class thread_lock{public: thread_lock() { pthread_mutexattr_init(&m_mutexatr); //互斥锁重复上锁,不会引起死锁,一个线程对这类互斥锁的多次重复上锁必须由这个线程来重复相同数量的解锁,这样才能解开这个互斥锁,别的线程才能 //得到这个互斥锁 pthread_mutexattr_

2016-07-29 15:30:25 1235

原创 Linux下高并发socket,单机提供五十万连接

引用《Linux网络编程》一个完整的Socket描述,五元组,{协议,本地地址,本地端口,远程地址,远程端口}当我们自己写客户端测试程序来测试我们的服务端程序性能的时候,经常会遇到连接量上不去的问题,大多都是停留在2万左右。如果我们的测试机器有限,要想达到百万连接量的测试,那我们哪里去找50台测试机器了?实际的测试也不可能给50台测试机器。那么根据这个五元组,我们可以做一下文章。首先协议已

2016-07-14 11:13:52 4860

空空如也

空空如也

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

TA关注的人

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