暂无个人介绍
IPv4相关结构: struct in_addr { in_addr_t s_addr; //表示32位的IP地址,32位无符号整型 } struct sockaddr_in { uint8_t sin_len; //表示该结构...
最近在写shell脚本,发现了一些shell 字符串的骚操作,可以提升效率。 字符串读取 ${var} : 变量var的值 ${var-DEFAULT} : 如果var没有被声明,var的值就是$DEFAULT ${var:-DEFAULT} : 如果var没有被声明,或者为空,var的值就是$D...
一直都是以简单的time_t t,time(&t),ctime(&t)来表示时间,后来要以时间为日志文件的名字时,就有点蒙逼了。学习一下。 tm结构: struct tm { int tm_sec; /* 秒 – 取值区间为[0,59] */ int tm_min; /*...
specfies multiple packages 错误 这是安装了多个相同的rpm包,所以无法卸载,可以加上--allmatches rpm -e xxx.rpm --allmatches error: %preun( ) scriptlet failed, exit status 1 错误 运行的脚本出了问题,无法正确运行,可以加上--noscripts rpm -e xxx.
问题现象 用rpm -Uvh升级后,原先的一个软链接被删除了,而采用先rpm -e 卸载rpm包,再rpm -ivh 安装包的方法,这个软链接还在。这个软链接是在rpm包安装的时候建立,也只有在rpm卸载的时候会删除。
在压测的时候,搭配nmon,可以很好的记录机器cpu情况,内存情况 下载 需要下载nmon和nmon analyser,到各自的官网下载。 nmon可以根据自己的操作系统版本下载二进制文件,免去安装。 下载网址:http://nmon.
CLOSED:TCP起始状态 LISTEN:绑定端口后进入listen状态,一般是服务端 SYN_SENT:发送SYN连接请求,主动打开连接的一方进入SYN_SENT SYN_RCVD:接收到SYN连接请求后进入SYN_RCVD,同时发送SYN,ACK。
pstack命令可显示每个进程的栈跟踪,pstack $pid即可,pstack命令须由$pid进程的属主或者root运行。 这次出现cpu占比100%的情况,但看memory占比,并无异常,怀疑是某个地方死循环了。
在C中,可变参数用于参数个数,类型不确定的情况,如printf,snprintf函数的实现。 当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表 void func(...); void func(parm_list,...); 这是C传参的一种形式,与固定参数不同。
snprintf()函数用于将格式化的数据写入字符串,其原型为: int snprintf(char *str, int n, char * format [, argument, ...]); str为要写入的目标字符串; n为能写入的字符的最大数目,超过n会被截断,包括'\0'符,所以能最大写入的其实是n-1个字符; format为格式化字符串,使用方式与printf()函数相同; argument为变量,可为多个,取决于format,这里的使用方式与printf相同。
查看cpu个数 总核数 = 物理CPU个数 * 每颗物理CPU的核数 总逻辑CPU数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数 查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l 查看每个物理CPU中...
linux内核提供了一个container_of()宏,可以根据结构体某个成员的地址找到父结构的地址。 #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr);\ (type *)( (char *)__mptr - offsetof(type,member) );) 而在Nginx也是效仿采用一样的宏获取父结构地址。
fuser命令可用于查看正使用指定file, file system, socket port的进程信息。使用-k参数可将这些进程杀掉,-i则在杀掉进程前给出提示 例子: [root@bogon ~]# fuser -k -i 80/tcp 80/tcp: 30922 30...
有时候遇到多层目录下的文件格式需要转换,dos2unix 没有-r之类的递归指令,所以需要与find还有管道结合。 find -type f | xargs dos2unix -o
问题描述 最近才知道公司安装新版本,不是rpm -e卸载再rpm -ivh安装,而是rpm -Uvh直接升级,导致了安装包里有些文件没有覆盖原有文件。 解决方法 找config,config(noreplace)的原理说明,http://people.
slowhttptest介绍 Slowhttptest是依赖HTTP协议的慢速攻击DoS攻击工具,设计的基本原理是服务器在请求完全接收后才会进行处理,如果客户端的发送速度缓慢或者发送不完整,服务端为其保留连接资源池占用,大量此类请求并发将导致DoS。
jmeter是跨平台组件,可在多平台下运行。一般,我在windows下用GUI编写脚本,然后在linux下运行 必备安装包 apache-jmeter-3.2.zip https://mirrors.
list_for_each(pos, head) pos、head 都为list类型 一般来说,head是list的虚拟头,依次取list上的各个节点 container_of(ptr, type, member) ptr:现已知的指针 type:要求的结构体类型 member:指针在结构体中的名称 该宏用于在已知结构中某个成员地址的情况下,求得结构体的起始地址 两个连用 haproxy中结构体间常含list成员,用于将多个节点串在一起,在依次取各节点成员的时候,需要上述两个宏搭配使用。
@(工作总结) 基本信息 全文-->摘要(hash) 摘要-->数字签名(私钥加密) 数字签名随全文一起发送,用于验证全文的完整性。 接收方接收到文件,用对应的公钥解密数字签名,得到摘要,对文件hash,然后对比摘要,一致则文件没被篡改过。
haproxy的内存管理中,通过pool_head->free_list,存储空闲内存块,free_list是个二级指针,却把空闲内存块都串了起来,没有用next,pre之类的指针。怎么实现的?着实思考了半个小时才明白。
haproxy内存池概述 内存池按照类型分类,每个类型的内存池都有一个名字,用链表记录空闲的内存块,每个内存块大小相等,并按照16字节对齐。 haporxy用pool_head 结构记录内存池 struct pool_head { void **free_list; /* 空闲链表 */...
被TIME_WAIT问题烦得不行,又发现了另一种解决方式,SO_LINGER. 对SO_LINGER解释最通用的自然是《UNP》,现摘录如下 SO_LINGER的值用如下数据结构表示: struct linger { int l_onoff; /* 0 =...
一、报文格式 http报文的三个组成部分 1.起始行,在请求报文中,起始行用于说明要做什么,响应报文中,起始行用于说明发生了什么。 2.首部字段,起始行后跟随零个或多个首部字段,首部字段为key:value的格式。
最近用http_load做压测,跑出来一大串“Cannot assign requested address ”的错误,查了一下,是TIME_WAIT过多导致的。因为短时间内有太多连接,所以占用了大量端口,同时关闭连接后又处于TIME_WAIT状态,端口不能复用,所以慢慢的无端口可用,所以就“Cannot assign requested address”了。
今天写脚本,遇到awk脚本向shell传参的情况,上网谷歌一下,发现都有些麻烦,通过管道,通过eval,感觉都很复杂。于是想到用read来试一下。 首先构造一个测试文件test.txt,里面的内容是1 2 3。
Packet size limited during capture 提示说明标记的包没有抓全,在某些操作系统中,默认只抓96个字节,tcpdump中有“-s”参数可用于指定要抓的字节数,“-s 1500”即每个包可以抓1500个字节,‘-s 0’每个包有多少抓多少 TCP Previous segment not captured 表明有网络包没抓到,可能是抓包工具漏掉了,也可能是真的丢了。
只实现了head/tail的基本功能,默认显示十行及-n参数。 一、使用带缓冲的系统调用。 write/read等系统调用是不带缓冲的,可以包装一层,使其带缓冲。
一、线程属性 可以使用pthread_attr_t结构修改线程默认属性,并这些属性和创建的线程练习起来,可以使用pthread_att_init函数初始化pthread_attr_t结构,调用pthread_attr_init后,pthread_attr_t结构所包含的就是操作系统实现支持的所有线程属性的默认值。
getopt和getoptlong被用来解析命令行参数。 一、getopt #include extern char *optarg; extern int optind, extern int opterr, extern int optopt;...
为了保证临界资源的安全性和可靠性,线程不得不使用锁,同一时间只允许一个或几个线程访问变量。常用的锁有互斥量,读写锁,条件变量 一、互斥量 互斥量是用pthread_mutex_t数据类型表示的,在使用之前,必须对其进行初始化,可以把它设置为PTHREAD_MUTEX_INITIALIZER(只适于静态分配的互斥量),也可以通过调用pthread_mutex_init函数进行初始化,最后还要调用pthread_mutex_destroy进行释放。
一、线程标识 和每个进程都有一个进程ID一样,每个线程也有一个线程ID,线程ID是以pthread_t数据类型来表示的,在Linux中,用无符号长整型表示pthread_t,Solaris 把phread_t数据类型表示为无符号整型,FreeBSD 和Mac OS X 用一个指向pthread结构的指针来表示pthread_t数据类型。
设置用户ID(set-user-ID),设置组ID(set-group-ID),sticky set-user-ID: SUID 当文件的该位有设置时,表示当该文件被执行时,程序具有文件所有者的权限而不是执行者的权限。
当UNIX函数发生错误时,通常会返回一个负值,而且整形变量errno通常被设置为具有特定信息的值。 errno是全局变量,仅当函数出错才有被改变。对待errno,应注意两条规则 1:如果没有出错,其值不会被例程清除,也就是说,当且仅当函数出错时,马上检查errno的值才有意义。
int mydup2(int oldfd, int newfd) { int tfd = 0; if (newfd < 0) { err_sys("newfd < 0"); } if (newfd == oldfd) {...
今天用arm-none-linux-gnueabi交叉编译libmysqclient.so,出现Native atomics support not found问题 进入mysql-connector-c-6.
使用UDT库,编写简单的网络通信程序,发现了一个问题,关闭一部分连接后,程序占用内存并没有变化。 比如先连接500个,再连接另500个,先关掉后面500个,程序占用内存降一半,再关掉500个,程序占用内存降到0.1。
思路是先用curl抓取网页源码,然后以关键字寻找出图片网址。 #include #include #include #include void get_key_from_str(char *origin, char *str1, char *str2, char *ke...
出现这个错误,是系统的glibc版本太低了,需要更新 到http://ftp.gnu.org/gnu/glibc/下载新版本的glibc,也不用太高,我选择glibc-2.20.tar.gz 解压完毕后 .
把工程文件交叉编译到arm上运行,着实花费了一番功夫。 首先遇到的错误是 X uses VFP register arguments, B does not 百度了一下,发现是硬浮点和软浮点的问题,原先是思路是改变X的编码方式,迁就于Y,后来怎么弄都不行,改变思路,用armv7-linux的编译器重新编几个库。
1.到http://www.apuebook.com/选择相应的版本下载源码,我的是2013版的 2.将apue.h拷到/usr/include目录下 3.将error.c拷到源文件下,编译的时候带上。 gcc -g -Wall main.c error.c -o test
epoll_wait()返回可用uid时,对uid取状态,本该是BROKEN的,却取到CLOSED,然而,不能像处理BROKEN事件那样处理CLOSED事件,这样移除不了CLOSED事件,于是epoll_wait不断返回该uid,就造成了死循环。
ld --verbose | grep SEARCH
diff -ruNa test1 test2 > test12.diff -r 比较子目录中的文件 -u 以合并的方式显示文件的不同 -N 比较目录时,若文件A仅出现在某个目录中,预设会显示:Only in目录:文件A若使用-N参数,则diff会将文件A与一个空白的文件比较 -a...
之前一直不知道在shell中调用read赋值后,怎么传给makefile中的变量,后来才恍然大悟。 myname := $(shell read -p "Enter your name:" name;\ echo $$name) all : @echo ${myname}
目前我知道的方法有四种 1.awk 'END {print}' 2.sed -n '$p' 3.sed '$!N;$!D' 4.awk '{b=a"\n"$0;a=$0}END{print b}'
动态库: file xxx.so 静态库 objdump -a xxx.a
一直都是以简单的time_t t,time(&t),ctime(&t)来表示时间,后来要以时间为日志文件的名字时,就有点蒙逼了。学习一下。 ```cpp tm结构: struct tm { int tm_sec; /* 秒 – 取值区间为[0,59] */ ...
很久没用笔记本上的ubuntu,用不顺手,比在公司调教了半年多的电脑差远了。一步一步来。先解决最不顺手的三件事 1.su认证失败。 新安装的ubuntu系统是无法切换到root账户的,得做一番修改 sudo passwd 密码: 输入新的UNIX密码: 确认密码: 这样就可以了 2.文件夹里打开终端 sudo apt-get install nautilus-open-terminal 然后nautilus -q重新加载文件管理器,或注销登陆即可生效。
一、DDNS简介 DNS,域名系统,是因特网的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人们更方便的访问互联网。 DDNS,动态域名系统,是域名系统(DNS)中的一种自动更新名称服务器内容的技术。
epoll 是为处理大量句柄而改进的poll,在UDT中也有支持。UDT使用了内核提供的epoll,主要是epoll_create,epoll_wait,epoll_ctl,UDT定义了CEPollDesc这个结构来管理epoll的描述符和套接字。