以技术为主
Linux编程
gdb调试程序之监控内存【七】
二 12th
gdb提供awtach rwatch watch来监控调试中变量或者内存的变化
awatch 命令
awtach [expr]
当debugger read或者write该expr时,debugger 停止
rwatch 命令
rwatch [expr]
当debugger read该expr时,debugger停止
watch命令
watch [expr]
当debugger write该expr时,debugger停止
说明:expr可以是变量或者是内存地址
vim使用技巧小结【继续更新】
十二 22nd
笔者在本博客上之前记录了vim相关方面的用法,现在总结下,记录的文章如下:
2. Vim纵向编辑模式的用法
4. vim中两个实用插件doxygen和projects的安装与使用
5. VIM查找替换归纳总结
6. vim编辑多个文件的方法
关于const与volatile笔试题目的分析
十 17th
昨天笔试遇到了关于c++中关于const与const_cast的题目,大概如下:
int main(int argc, char* argv[]) { const int a = 10; int * p = const_cast<int *>(&a); *p = 1; printf("%d %d\n", a, *p); return 0; }
求上述程序的输出结果,正确答案是:10 1
分析如下:
首先可以确定是p和&a的地址是指向同一片内存区域的,理论上来说最后的输出结果应该是1 1
但是为什么会输出a的值为10呢? 猜测应该是const关键字的问题,可能编译器看到a为const型变量,所以在编译期就将所有的a直接替换为10了,这个是编译器做的一个优化,
下面简单的验证下:
直接使用下面的命令来看下编译后的汇编代码,关键部分的汇编如下:
movl %edi, -20(%rbp) movq %rsi, -32(%rbp) movl $10, -12(%rbp) leaq -12(%rbp), %rax movq %rax, -8(%rbp) movq -8(%rbp), %rax movl $1, (%rax) movq -8(%rbp), %rax movl (%rax), %edx movl $10, %esi movl $.LC0, %edi movl $0, %eax call printf movl $0, %eax leave ret
显然%rax中存放的指针p的值,(%rax)代表间接寻址
在调用printf函数之前,将10放入%esi, (%rax)放入到%edx中,显然验证了上述的猜想
关于volatile关键字
如何避免编译器做这方面的优化呢?
一个常用的方法是将变量a加上关键字volatile,代表是”易变,每次都需要从内存中读取,这样上述程序的运行结果就是1 1了
当然修改常量变量的值不是好的编程习惯,尽量还是少用上述用法
linux关于sort命令的高级用法(按多个列值进行排列)
十 8th
如果单纯地使用sort按行进行排序比较简单,
但是使用sort按多个列值排列,同时使用tab作为分隔符,而且对于某些列需要进行逆序排列,这样sort命令写起来就比较麻烦了
比如下面的文件内容,使用[TAB]进行分割:
Group-ID Category-ID Text Frequency ---------------------------------------------- 200 1000 oranges 10 200 900 bananas 5 200 1000 pears 8 200 1000 lemons 10 200 900 figs 4 190 700 grapes 17
下面使用这些列进行排序(列4在列3之前进行排序,而且列4是逆序排列)
* Group ID (integer)
* Category ID (integer)
* Frequency “sorted in reverse order” (integer)
* Text (alpha-numeric)
排序后的结果应该为:
Group-ID Category-ID Text Frequency ---------------------------------------------- 190 700 grapes 17 200 900 bananas 5 200 900 figs 4 200 1000 lemons 10 200 1000 oranges 10 200 1000 pears 8
可以直接使用sort命令来解决这个问题:
sort -t $'\t' -k 1n,1 -k 2n,2 -k4rn,4 -k3,3 <my-file>
解释如下:
-t $'\t':指定TAB为分隔符 -k 1, 1: 按照第一列的值进行排序,如果只有一个1的话,相当于告诉sort从第一列开始直接到行尾排列 n:代表是数字顺序,默认情况下市字典序,如10<2 r: reverse 逆序排列,默认情况下市正序排列
所以最后的命令:sort -t $'\t' -k 1n,1 -k 2n,2 -k4rn,4 -k3,3 my-file
debian系统sshd连接慢的解决办法
八 26th
最近客户端连debian下sshd很慢,每次都需要等待半分钟左右,今天终于无法忍受了,上网找了下资料,把这个问题解决了
原因:
主要是debian在默认情况下开启了dns的反向解析,这个比较耗时
解决方法:
1. 编辑/etc/nsswitch.conf 找到hosts行,替换为
hosts: files dns [NOTFOUND=return]
2. 查看/etc/resolv.conf文件,查看dns地址是否设置正确,如果没有用,直接注掉即可
3. 重启sshd : 先kill掉,然后/usr/sbin/sshd 启功即可
查看 CPU, Memory, I/O and NetFlow[转载]
八 10th
原文地址:http://blogread.cn/it/article.php?id=3908&f=sa
iostat 查看磁盘 I/O
[root@localhost ~]# iostat -d -x 2
extended device statistics
device mgr/s mgw/s r/s w/s kr/s kw/s size queue wait svc_t %b
hda 0 0 0.0 0.9 0.1 5.4 6.3 0.0 4.7 0.9 0
extended device statistics
device mgr/s mgw/s r/s w/s kr/s kw/s size queue wait svc_t %b
hda 0 3 0.0 2.0 0.0 20.0 10.0 0.0 0.8 0.5 0
......
命令释意: 查看磁盘 I/0 情况,且每两秒刷新一次
[root@localhost ~]# vmstat 5 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 284 68700 165876 416748 0 0 0 5 1 1 0 0 100 0 0 ......
命令释意: 查看CPU使用情况的命令, 每 5 秒刷新一次,最右侧列为 CPU 的占用率的数据
top 查看进程占有率
[root@localhost ~]# top
然后在 top 的命令内部命令栏输入shift+p or P
top - 13:38:52 up 102 days, 4:17, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 81 total, 2 running, 79 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1035292k total, 966592k used, 68700k free, 165876k buffers
Swap: 2096472k total, 284k used, 2096188k free, 416760k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4875 root 15 0 2192 1000 800 R 0.3 0.1 0:00.15 top
1 root 15 0 2060 620 532 S 0.0 0.1 0:01.65 init
2 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/0
.......
命令释意: 查看进程处理器占用率情况,并对其进行排序
free 查看内存使用情况
[root@localhost ~]# free
total used free shared buffers cached
Mem: 1035292 966592 68700 0 165876 416768
-/+ buffers/cache: 383948 651344
Swap: 2096472 284 2096188
命令释意: 查看内存使用情况
top 查看进程内存使用
[root@localhost ~]# top
然后在 top 的命令内部命令栏输入shift+m or M
top - 13:48:52 up 102 days, 4:27, 1 user, load average: 0.00, 0.01, 0.00 Tasks: 81 total, 2 running, 79 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1035292k total, 966592k used, 68700k free, 165876k buffers Swap: 2096472k total, 284k used, 2096188k free, 416784k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4128 root 34 19 280m 266m 2112 S 0.0 26.4 1:48.40 yum-updatesd 8314 www 18 0 171m 34m 34m S 0.0 3.4 0:06.03 memcacheq 8280 www 15 0 88084 34m 588 S 0.0 3.4 0:01.23 memcached 10907 mysql 15 0 122m 16m 3892 S 0.0 1.7 0:25.29 mysqld ......
命令释意: 查看进程内存占用率情况,并对其进行排序
更多 >
使用mmap实现文件的拷贝
七 4th
今天看csapp看到了虚拟存储器的映射以及mmap函数的用法,作为练习,使用mmap来实现文件的拷贝操作,同时与传统的文件拷贝操作进行了性能比较。
mmap与munmap函数介绍:
#include <unistd .h> #include <sys /mman.h> void *mmap(void *start, size_t length, int prot, int flag, int fd, off_t offset); //返回:若成功时则返回映射区域的指针,若出错则为MAP_FAILED(-1) </sys></unistd>
start: 最好从start开始的一个区域,这个是hint,具体映射结果还是要看返回结果
length: 映射区域的大小
prot: 映射区域的访问权限位 PROT_EXEC PROT_READ PROT_WRITE PROT_NONE
flags: 映射对象的类型 MAP_ANON MAP_PRIVATE MAP_SHARED
munmap函数删除映射区域
#include <unistd .h> #include <sys /mman.h> int munmap(void *start, size_t length); </sys></unistd>
实验
分别使用了mmap函数和普通的read write实现了文件的复制拷贝,下面是通过复制50M的文件性能分析:
[yangguang@sim124 ~]$ time ./workspace/mmapcopy linux-20101214.tar.gz ./output real 0m0.100s user 0m0.034s sys 0m0.065s
[yangguang@sim124 ~]$ time ./workspace/copy linux-20101214.tar.gz ./output real 0m5.016s user 0m0.000s sys 0m0.124s
可以看到使用mmap的性能明显高于使用Read write的方式,这里主要原因是使用mmap减少了用户态和内核态间数据
的拷贝
更多 >
vim中recording模式详解
六 9th
今天看到这个视频:http://v.youku.com/v_show/id_XODk1NjkyNTI=.html
里面有一段是对某一行进行修改,然后可以将这些修改应用到与这一行类似的其他行,然后就想到了vim中recording模式,今天好好总结学习下。
进入recording模式
在正常状态(正常状态 = !insert状态 && !visual状态)下,按q,再按下一个字母或数字,这个数字代表缓冲区的名字,是键盘操作存储的位置,这时编辑器下方就显示”recording(记录)”字样,然后进行操作,最后按q退出这中模式,这样在这期间进行的操作就保存在缓冲区中了
生效缓冲区的内容
怎样将同样的操作在类似的行上生效呢?
使用@后面加上缓冲区的名字即可
实际例子
在文本区中存在以下内容:
int a; int b; int c; int d;
然后将光标放入到第一行的第一个字符输入以下内容:qm$i=1+1<ESC>q
qm:表示进入recording模式,选择缓冲区m
$i:定位到行尾并进入插入模式
=1+1:表示插入的内容
<ESC>q:返回正常状态,并退出recording模式
最后将光标定位到第二行的行首,输入:@m
以下几行类似操作。
最后文本内容变为:
int a=1+1; int b=1+1; int c=1+1; int d=1+1;
参考资料:http://hi.baidu.com/xiaowp/blog/item/c27b50543bb08a53574e0066.html
SMTP邮件服务器postfix配置与使用
六 1st
最近要帮朋友配置一个SMTP服务器,需求就是每天需要向外发送上百万封邮件,google之,发现postfix邮件服务器比较靠谱, 能够发送外部邮件,于是就选它了
操作系统:CentOS 5 32bit
postfix安装
可以通过源码安装最新的版本,但是为了方便,我直接使用yum安装
sudo yum install postfix
配置文件路径:/etc/postfix/main.cf
postfix启动与停止命令:
sudo /etc/init.d/postfix start sudo /etc/init.d/postfix stop sudo /etc/init.d/postfix restart
postfix日志文件位置:/var/log/maillog
卸载sendmail
检查系统是否安装sendmail:
rpm –qa |grep sendmail
如果存在,卸载之
rpm -e sendmail --nodeps
安装cyrus-sasl-2.1.23
由于在centos 源中不存在,直接通过源码安装cyrus-sasl-2.1.23.tar.gz
下载地址
./configure &&make &&make install
这个软件包的作用就是postfix邮件服务器的认证,因为如果转发外部的邮件,必须使用smtpd_recipient_restrictions选项的值check_relay_domains或者是reject_unauth_destination,二者必须选一个,而relay_damains手工来配置允许的邮件域太麻烦,所以就选用sasl认证
修改sasl配置:/etc/sysconfig/saslauthd为
# Directory in which to place saslauthd's listening socket, pid file, and so # on. This directory must already exist. START=yes SOCKETDIR=/var/run/saslauthd # Mechanism to use when checking passwords. Run "saslauthd -v" to get a list # of which mechanism your installation was compiled with the ablity to use. #MECH="pam" MECHANISMS="pam" #使用linux自身的用户认证 # Additional flags to pass to saslauthd on the command line. See saslauthd(8) # for the list of accepted flags. #FLAGS=
然后重启saslauthd:
sudo /etc/init.d/saslauthd restart
测试saslauthd生效:
/usr/sbin/testsaslauthd -u liyg -p liyangguang
将sasl与postfix结合
在main.cf文件中加入:
#added by liyangguang smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination #smtpd_client_restrictions = permit_sasl_authenticated smtpd_sasl_auth_enable = yes broken_sasl_auth_clients = yes smtpd_sasl_security_options = noanonymous
重启postfix :sudo /etc/init.d/postfix restart。
然后通过foxmail客户端配置smtp服务器地址,测试发送邮件是否成功
参考资料:
http://yahoon.blog.51cto.com/13184/40091
http://www.postfix.org/RESTRICTION_CLASS_README.html
http://publish.it168.com/2006/0221/20060221219401.shtml
近期评论