strace是一个优秀的调试工具,它调用的是系统函数ptrace(),缺点是导致应用程序运行的非常慢。
strace -e open target-file
strace -o out ls
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count)
#mknod
mknod [opiton] NAME TYPE [major num] [minor num]
mknod /dev/memory c 60 0
因为debian在自带的python为2.7,在执行其他的一些东西时会碰上各种各样的问题,所以,升级版本是唯一的选择.
1、下载python3.3安装包
wget http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz
2、解压安装包
tar -zxvf Python-3.3.0.tgz
3、进入解压后目录
cd Python-3.3.0
4、创建安装目录
mkdir /usr/local/python3.3
5、编译安装
./configure --prefix=/usr/local/python3.3
6、执行
make
make install
7、此时已完成新版本的安装,但由于老版本还在系统中,所以需要将原来/usr/bin/python链接改为新的连接: 先修改老的连接,执行
mv /usr/bin/python /usr/bin/python_bak
再建立新连接
ln -s /usr/local/python3.3/bin/python3.3 /usr/bin/python
8、查询python版本,执行:
python --version
现在主流系统不推荐使用这种方法了,但是有时候为了方便,会简单的使用一下,比如,我的这篇文章install django,但是当我日后想要卸载旧版的 Django遇上问题了,不知道使用的哪个方法安装的,现在简单的记录下:
可以再重新安装一遍,找到egg包。
sudo easy_install install -m django
# 在输出的界面上有这个egg的位置
rm -rf path-sth-egg
这两篇文章有点相互引用的味道,够了。
here,在这篇文章里,人家给了一个比较好的原因说使用pip,下面看看怎么使用吧。
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
# 注意,使用 pip install -U pip检查最新的pip版本
这里多说一句,你觉得是不是应该将python设置最新的?不一定的,但是更新最新版本,有好处。django最新版本,就是面向了python 3.6
这个软件可以使用 “uninstall”选项,甚至可以删除easy_install
软件安装的包。
使用Django软件啥的,就需要一个虚拟环境,这个环境就是系统的一个位置,你可以在其中安装包,并将其与其他Python包分离,这样做是有益的。
书上说,python 3 以上可以直接使用
python -m venv ll_env
来建立虚拟环境但是在我的机器上有些问题,现在先放下[question].
可以使用virtualenv包,这样就问题不大了。
pip install --user virtualenv
下面就是建立一个目录mysite, 然后创建一个虚拟环境.
cd my_project_folder
virtualenv ll_env
# 激活
source ll_env/bin/activate
这个命令执行后,会在本地生成一个与ll_env 的文件夹,包含python的可执行文件和pip库的拷贝,可用于安装其他包。
但是有时候你想使用系统中其他的包,在虚拟环境下你是无法使用的。如果在系统环境中想要使用系统环境的第三方的软件包,可以在创建虚拟环境的时候使用 -system-site-packages
参数。
virtualenv --system-site-packages
还可以制定python的版本,当然前提是你的系统中已经安装了相应的python。
virtualenv -p /usr/bin/python2.7 env
deactivate
但是还有问题怎么办?比如我的就是有问题了,上面的命令不好使,我自己的解决方案就是再装一遍:
pip install --user virtualenv
这时候你会看到那个virtualenv.py文件在哪了,接着使用:
python path-virtualenv dest-dir
这样就可以了。
#正则表达式 ###匹配一个单词 “Hello World” =~ /World/; #成功 这里“Hello World”是一个字符串,World是正则表达式,/ /包围的/World/告诉perl为了匹配搜索字符串,操作符是”=~”连接字符串和正则表达式。
正则表达式操作符有两种, =~ 和!~. ###() group Perl 中引入了一个(),由此出现的 \1,\2是抓取(),(\1 is back reference)
$_ = "abba";
if (/(.)\1/) {
print "It matched "
}
(.)\1是说你现在匹配一个紧挨着这个字符的东西,上面的例子中,(.)匹配一个a,当它往后寻找时,必须找一个同他匹配的。现在是ab,则匹配下一个是abb,于是就匹配了bb.
不是不是,为什么原文书我看不懂
/(fred)*/ matches strings like hello, world
#perl的调试技术 下面说的perl的调试技术是针对Perl解释器本身,可以通过 -d 选项打开这个功能,我们简单的就这个调试技术做个了解。
perl -d xx.pl
这样就打开了调试功能。 ##插入/查看/删除断点
插入断点使用b命令,格式为 b 行号/函数名 条件
查看断点使用L命令,注意使用大写。小写只会显示程序尚未到达的部分内容。
删除断点使用B命令,格式为 B 行号|* ,使用通配符删除所有的断点。 ##增加/查看/删除监视 新填一个变量,格式 w $val==1
查看这个变量,格式 p $val==1
删除这个变量,格式 W $val==1 ##步入执行 碰到子程序会进入到子程序, 命令 s
退出执行的命令为 r
##退出调试
q
p128 =======摘自网络======
</pre>
想要真正使用mutt,必须详细了解邮件系统的运作机制
首先是安装必须的软件
sudo apt-get install mutt fetchmail procmail msmtp
2. 邮件接收程序fetchmail和邮件分拣程序procmail后,首先分别创建各自的配置文件$ HOME/.fetchmailrc和$HOME/.procmailrc,这样为的是让我们能独立使用fetchmail和procmail这两个程序 通过pop接收并分拣邮件。
###关于mutt的一点说明
1.邮件处理分为很多部分,这取决于你想如何应用这个邮件系统。
邮件客户端(MUA), A mail user agent MUA:
MUA: Mail User Agent (email client)
MTA: Mail Transport Agent (SMTP server)
mutt and SMTP
MDA: Mail Delivery Agent
MRA: Mail Retrieval Agent (POP/IMAP client)
在这里,我们使用mutt作为邮件客户端。
###分步讲解 2.1
MUA:让用户管理,如阅读、储存邮箱里的email,或者通过MSA将新的邮件发出。 除了在unix上流行的mutt,其他较为流行的MUA还有:
Other popular MUAs include Thunderbird, Kmail, evolution, Sylpheed,mulberry, pegasus, pine, and elm (mutt’’s predecessor)…
2.2
MTA: Mail Transport Agent(SMTP server)
MTA的功能是接受、发送email到其他的MTAs,在Internet上,MTAs与MTAs交流使用的是 the Simple Mail Transfer Protocol,简称SMTP.官网上还有很多,自己也没有看懂,先就不写了
较流行的MTAs有
exim
postfix
sendmail
qmail
2.3
MDA: Mail Delivery Agent
MDA的功能是从MTA接收一封email或者发送(过滤)email到用户的邮箱文件夹。
而MDAs用的较多就是procmail.
2.4
MRA: Mail Retrieval Agent(POP/IMAP client)
MRA的处理对象是POP/IMAP,很多功能和MUAs很象如果你能直接使用SHELL-cmd或者mutt直接读取邮件服务器的本地邮件,就不需要MRA了。
我的理解是我们之所以使用MRA是我们能直接使用上面情况的机会很少,更多的使用是例如网易的163、126,google的gmail的邮件服务器,那么就需要MRA将他们服务器上的邮件转移到你这儿来
MRA使用较多的是
fetchmail ( http://fetchmail.berlios.de/)
getmail ( http://pyropus.ca/software/getmail/)
retchmail ( http://freecode.com/projects/retchmail)
##注意
在实际应用中,上面的划分存在很多变体,与上面各个子系统的功能会有部分的叠加和交叉,其实,上面的邮件子系统也存在着很多交叉的功能,大家注意区分,毕竟,万变不离其宗。 ###参考—–
http://www.iki.fi/era/procmail/mini-faq.html#appendix-mx
http://www.feep.net/sendmail/tutorial/intro/MUA-MTA-MDA.html
http://ebusiness.gbdirect.co.uk/howtos/mail-system.html
http://twiki.org/cgi-bin/view/Wikilearn/EmailServerSketches
http://www.tldp.org/HOWTO/Mail-User-HOWTO/
http://www.netbsd.org/docs/guide/en/chap-mail.html
=====================
前面都是基本知识,废话,下面才是重点
====================
#安装过程
建议源码安装,我自己偷懒了直接(先测试 mutt -v,若找不到,可能你的linux发行版没有安装)
sudo apt-get install mutt
接着 mutt -v会出现
System: xxx [using ncurses 5.2] [using libiconv 1.7]
Compile options:
-DOMAIN
-DEBUG
-HOMESPOOL +USE_SETGID +USE_DOTLOCK +DL_STANDALONE
+USE_FCNTL -USE_FLOCK
+USE_POP +USE_IMAP -USE_GSS +USE_SSL -USE_SASL -USE_SASL2
+HAVE_REGCOMP -USE_GNU_REGEX
+HAVE_COLOR +HAVE_START_COLOR +HAVE_TYPEAHEAD +HAVE_BKGDSET
+HAVE_CURS_SET +HAVE_META +HAVE_RESIZETERM
+CRYPT_BACKEND_CLASSIC_PGP +CRYPT_BACKEND_CLASSIC_SMIME
-CRYPT_BACKEND_GPGME -BUFFY_SIZE -EXACT_ADDRESS -SUN_ATTACHMENT
+ENABLE_NLS -LOCALES_HACK +HAVE_WC_FUNCS +HAVE_LANGINFO_CODESET +HAVE_LANGINFO_YESEXPR
+HAVE_ICONV -ICONV_NONTRANS -HAVE_LIBIDN +HAVE_GETSID -HAVE_GETADDRINFO
-ISPELL
SENDMAIL="/usr/lib/sendmail"
MAILPATH="/var/mail"
...
EXECSHELL="/bin/sh"
我们可以看出mutt的默认发送邮件的程序是 sendmail,下面我们使用msmtp来发送邮件, (配置文件先不写,在msmtp的后面) ##install msmtp sudo apt-get install msmtp
msmtp 是一款专门负责邮件发送的客户端软件,基于GPL发布,支持TLS/SSL、DNS模式、IPv6、服务器端认证、多用户等特性。
创建msmtp的配置文件~/.msmtprc,内容如下:
vim $HOME/.msmtprc
这个配置文件都要注意权限,
chmod 0600 $HOME/.msmtprc
保护模式下段描述表分为全局描述符表(GDT)、中断描述表(IDT)、局部描述符表(LDT)。
linux使用以下段描述符:
.内核代码段
.内核数据段
.用户代码段
.用户数据段
.TSS段
.默认LDT段
GDT中的内核代码段(kernel code segment)描述表中的值如下:
.Base = 0x00000000
.Limit 0x00000000(2^32-1 = 4GB)
.G(颗粒标识) = 1,表示段的大小是以页为单位的
.S = 1,表示普通代码段或数据段
.Type = 0xa, 表示可以读取或者可以执行的代码段
.DPL = 0,表示内核模式
与这个段相关的线性地址是4GB, S=1 和type=0xa表示代码段,选择器在cs寄存器中,linux访问这个段选择器的宏是_KERNEL_CS.
Kernel data segment与上面的代码段相似,只是.Type的字段值为2,选择器在ds寄存器中,访问这个段选择器的宏是_KERNEL_DS
user code segment 由处于用户模式下的所有进程共享,存储在GDT中的对应段描述符的值如下:
.Base = 0x00000000
.Limit = 0xffffffff
.G = 1
.S = 1
.Type = 0xa
.DPL = 3 可使用_USER_CS访问 user data segment 中唯一不同的字段就是Type = 2,使用_USER_DS
除了以上的段描述表以外,GDT中还包含了用于创建每个进程的段描述 - TSS和LDT
每个TSS代表一个不同的进程,TSS中保存了每个CPU的硬件的上下文信息,它有助于切换上下文。
每个进程都有自己在GDT中存储器的对应的TSS描述符,其值如下:
.Base = &tss(对应进程描述符的TSS字段的地址,例如&tss_struct)
.Limit = 0xeb(TSS段的大小是236字节)
.Type = 9或11
.DPL = 0,用户模式不能访问TSS。G位被清除。