存档

‘学习’ 分类的存档

中断中为什么不能睡眠

2011年11月14日 1 条评论

中断上下文或者其他不允许阻塞的代码中为什么不能调用会睡眠的函数?

“睡眠”指的是进程的状态,tast_struct结构体内的state专门描述进程状态,变为”TASK_INTERRUPTIBLE”或者“TASK_UNINTERRUPTIBLE”的时候就变成睡眠状态了。内核调度机制会在state变为”TASK_RUNNING”时重新调度。中断上下文中内核运行中断处理程序,不属于任何进程,所以一旦休眠,就没有办法唤醒(睡眠和唤醒都是针对”进程“而言)。

从中断本身的特点,要求立即响应,如系统内的定时器就是用时钟中断产生的,如果时钟中断休眠,定时器就没法用了。

分类: 内核 标签: , ,

用sed截取文本段

2011年3月8日 11 条评论

今天一个一块实习的小伙问了我一个问题,怎么通过正则表达式把文本中的一段截取出来,
文本大概的格式是这样的:

begin
a
b
c
d

end

取出每一个begin和end之间的部分,每一对begin和end之间的内容是不一样的。一开始我想这个问题时的思路是用sed根据正则表达式的多行匹配,;^begin\n.*end$;直接把那部分截取出来,后来试了试sed好像没法匹配跨行的正则表达式,不知道是不是因为我用的不对,sed处理数据的时候默认是按照行来处理的,不知道能不能有什么选项可以匹配多行。
最后想了想,解决方法是
sed -n ‘/^begin/,/end$/p’ file |grep -v begin|grep -v end 阅读全文…

分类: 脚本 标签: , ,

密码保护:Bugzilla注册时强制填入必需的信息

2011年2月16日 要查看留言请输入您的密码。

这是一篇受密码保护的文章,您需要提供访问密码:

密码保护:Bugzilla给每个product添加默认version和默认Hardware

2011年2月10日 要查看留言请输入您的密码。

这是一篇受密码保护的文章,您需要提供访问密码:

分类: Perl & Bugzilla, 工作 标签:

密码保护:在bugzilla下的bug id添加前缀

2011年2月10日 要查看留言请输入您的密码。

这是一篇受密码保护的文章,您需要提供访问密码:

分类: Perl & Bugzilla, 工作 标签:

/etc/init.d和/etc/rc.d/init.d的关系

2011年1月16日 没有评论

这两个其实是同一个东西,/etc/init.d是/etc/rc.d/init.d的软链接。并且这个东西只有在fedora下面有,ubuntu下面没有/etc/rc.d/这个目录,只有/etc/init.d,openSUSE下面有/etc/rc.d,直接链接的/etc/init.d。

并且有时候可以看到rc0.d/这样的目录,查看这些目录里的文件,ls -l,发现都是软链接。

要想搞明白这里面的关系就要搞明白Linux的运行级。打开/etc/inittab,里面应该有注释,

# 0 – 停机(千万别把initdefault设置为0,否则系统永远无法启动)
# 1 – 单用户模式
# 2 – 多用户,没有 NFS
# 3 – 完全多用户模式(标准的运行级)
# 4 – 系统保留的
# 5 – X11 (x window)
# 6 – 重新启动 (千万不要把initdefault 设置为6,否则将一直在重启 )

不同的运行级,开机启动的时候会开启不同的服务,所以当开机以后执行init(pdi为1,是开机后执行的第一个进程,所有其他进程都是这个进程的后代)这个进程,就会根据不同的运行级开启不同的默认服务(fedora下是读取rc.sysinit)。

可以看到rc0.d/这样的目录下的脚本前面都带有S或者K,s就是start,k就是kill。比如说当你从运行级5到3切换的时候,可能就会关掉有些服务,这时候就会执行k开头的脚本。

并且字母后面会接着数字,表示的是脚本执行的先后顺序,数字越小越早执行,很多时候这些执行顺序是很重要的,比如要启动Apache服务,就必须先配置网络接口,不然一个没有IP的机子来启动http服务那岂不是很搞笑…
阅读全文…

Ubuntu 9.04下VPN的配置及管理

2011年1月12日 4 条评论

教研室里人太多,用P2P软件又没人管(都是师兄师姐,做人就不能自觉点),网络配置又有问题,所以经常上不去网…

好在还多了一个端口,就跟几个同学整了个路由器一起用了,教研室还有台废机子,就顺带整了个VPN,这样在寝室的时候也可以连VPN上网了…

主要步骤都来源于这篇:

http://blog.istef.info/2008/10/17/ubuntu-pptp-server/

在此也感慨一下,网上的东西太多太乱了,Google一下,出来的东西倒是不少,但是找到准确的太难了…在这个信息泛滥的时代,大家也尽量少制造些垃圾吧…

基于引用文章的精简配置:

sudo apt-get install pptpd
sudo vi /etc/pptpd.conf
去掉文件最末端的 localip 和 remoteip 两个参数的注释,并进行相应修改。这里,localip 是 VPN 连通后服务器的 ip 地址,而 remoteip 则是客户端的可分配 ip 地址。下面是我的配置:

localip 192.168.0.1

remoteip 192.168.0.2-8
sudo vi /etc/ppp/pptpd-options
其他默认,只需修改ms-dns,改成所在地区的dns,不过我加了一个Google的DNS ms-dns 8.8.8.8;
sudo vi /etc/ppp/chap-secrets #设置拨号用的用户名及密码,格式如下

a pptpd 密码 *

开启IPV4 forward

sudo vi /etc/sysctl.conf

找到类似下面的行并取消它们的注释:

net.ipv4.ip_forward=1
阅读全文…

分类: 旧档, 脚本 标签: , , , ,

grep如何匹配用引号括起来的内容

2011年1月12日 1 条评论

Shell脚本学习指南(台湾奥莱利公司编译,机械工业出版社出版的那本)在53页提到后向引用在寻找重复字以及匹配引号时特别好用,然后举了一个匹配引号的例子:

\([” ‘]\).*\1

这个例子不对,在同一页的上面,书上说在方括号表达式中,所有其他meta字符会失去特殊含义,所以[*\.]匹配字面上的星号。反斜杠和句点,这点是对的,但是引号在方括号表达式中不会失去特殊含义,所以要用反斜杠关闭特殊意义。

正确的

\([\”\’]\).*\1

一个例子,用grep查找当前目录下包含用引号(不管是单引号还是双引号)扩住administration字样的内容

grep -r “\([\”\’]\)administration\1” *

正则表达式中的*与Shell通配符中的*

2011年1月12日 1 条评论

一开始想到一个问题:

正则表达式中的meta字符* 定义是匹配*之前的0到任意个字符,但是平时在用的时候,比如说想删除一个目录下的所有log文件,命令是rm -f *.log,这里的*之前没有任何字符啊,定义的.是可以匹配任意的单个字符,但是如果运行命令rm -rf ..log或者rm -rf ./.log都是不对的… 

搞了一下终于明白了,Shell通配符(又叫Wildchar)跟正则表达式(Regual Expression )是两套不同的匹配法则,并不一样,具体点的内容可以看下http://blog.csdn.net/zdl1016/archive/2010/08/22/5829499.aspx或者搜索一下。

在文本过滤工具里,都是用正则表达式,比如像awk,sed等,是针对文件的内容的。
通配符多用在文件名上,比如查找find,ls,cp,等等。

所以在命令行上要用到正则表达式的时候,一般都会用引号括起来,比如说 grep或者sed。