I want to be a complete engineer - technical genius and sensitive humanist all in one!
Wednesday, September 2, 2009
ubuntu上使用scim和gajim技巧两则
Gajim 0.12.1 says that he can’t run with root privileges. This is new feature that appeared in Fedora 10. In earlier versions it was normaly running under root. Anyway let’s turn off this feature in case that you need to run Gajim under root.
Open /usr/bin/gajim with your favorite text editor, find 24th line and just comment out this part of code:
if test $(id -u) -eq 0; then
echo "You must not launch Gajim as root, it is INSECURE"
exit 1
fi
After commenting it should look like
#if test $(id -u) -eq 0; then
# echo "You must not launch Gajim as root, it is INSECURE"
# exit 1
#fi
Save file. Thats it.
-------------------------------------------------------------------------------
root 下的中文显示问题解决方法如下
9.04中选择root进入系统,无法显示中文桌面,而且选择中文后也没有作用, 而在/etc/environment中,"LANGUAGE=zh_CN:zh:en_US:en"是不用修改的,改后有没问题还不清楚。
解决方法:
在root下打开隐藏文件.profile。
修改root下隐藏文件.profile,把最后的两行 LANG=C 和LANGUAGE=C改为如下所示后重启。
以下是修改过的。
# ~/.profile: executed by Bourne-compatible login shells.
if [ "$BASH" ]; then
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
fi
mesg n
# Installed by Debian Installer:
# no localization for root because zh_CN.UTF-8
# cannot be properly displayed at the Linux console
LANG=C #修改此行为:LANG="zh_CN.UTF-8"
LANGUAGE=C #修改此行为:LANGUAGE="zh_CN:zh"
然后重启,选择以root进入系统,即可显示中文。
Monday, August 3, 2009
sendfile函数
显示如下:
SENDFILE(2) Linux Programmer’s Manual SENDFILE(2)
NAME
sendfile - transfer data between file descriptors
SYNOPSIS
#include
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
DESCRIPTION
sendfile() copies data between one file descriptor and another.
Because this copying is done within the kernel, sendfile() is more
efficient than the combination of read(2) and write(2), which would
require transferring data to and from user space.
in_fd should be a file descriptor opened for reading and out_fd should
be a descriptor opened for writing.
If offset is not NULL, then it points to a variable holding the file
offset from which sendfile() will start reading data from in_fd. When
sendfile() returns, this variable will be set to the offset of the byte
following the last byte that was read. If offset is not NULL, then
sendfile() does not modify the current file offset of in_fd; otherwise
the current file offset is adjusted to reflect the number of bytes read
from in_fd.
count is the number of bytes to copy between the file descriptors.
Presently (Linux 2.6.9): in_fd, must correspond to a file which sup‐
ports mmap(2)-like operations (i.e., it cannot be a socket); and out_fd
must refer to a socket.
Applications may wish to fall back to read(2)/write(2) in the case
where sendfile() fails with EINVAL or ENOSYS.
RETURN VALUE
If the transfer was successful, the number of bytes written to out_fd
is returned. On error, -1 is returned, and errno is set appropriately.
这些日子编写网络相关的程序,偶尔发现这个api,据说效率奇高。sendfile()在在两个文件描述符之间完成数据拷贝操作,该操作是内核中完成的,所以称为"零拷贝"。sendfile函数比起read和write函数高效的原因在于read和write是要把数据拷贝到用户应用层操作而sendfile不需要。
目前手头时间比较紧迫,抽空出来写个测试程序看看使用这个api与使用其他api到底效率差别有多大。
man手册分类
man手册分为以下几个章节:
(1)standard commands (标准命令)
(2)system calls (系统调用)
(3)library functions (库函数)
(4)special devices (设备说明)
(5)file formats (文件格式)
(6)games and toys (游戏和娱乐)
(7)miscellaneous (杂项)
(8)administrative Commands (管理员命令)
如需要查阅网络编程里面send系统调用的帮助信息,如果直接输入$man send则显示的是send命令的帮助信息,要想正确得到send系统调用的信息,需要$man 2 send 。
NOTE:man是通过手册的章节号来搜索帮助信息的。
Tuesday, July 21, 2009
Install XMMS on Ubuntu
We need to download the required packages to compile XMMS
# sudo apt-get install autotools-dev automake1.9 libtool gettext libasound2-dev libaudiofile-dev \
libgl1-mesa-dev libglib1.2-dev libgtk1.2-dev libesd0-dev libice-dev libmikmod2-dev libogg-dev \
libsm-dev libvorbis-dev libxxf86vm-dev libxml-dev libssl-dev build-essential make
Depending on your internet connection and your machine this may take some minutes.
Second Step:
Prepare the XMMS for compiling
Create a directory in your HOME directory:
# mkdir ~/build
Change the working directory to it:
# cd ~/build
Download XMMS sources:
# wget http://xmms.org/files/1.2.x/xmms-1.2.11.tar.gz
Unpack it:
# tar xvf xmms-1.2.11.tar.gz
Change the working directory to the source directory:
# cd xmms-1.2.11/
Third Step:
Compiling it:
This generates the necessary files, and checks your system:
# ./configure --prefix=/usr
The actually compiling
# make
Fourth Step:
Install it:
# sudo make install
After install we no longer need the source directory:
# cd
# rm -rf ~/build
That's it, now we can run XMMS: press ALT+F2 write xmms there and hit enter and enjoy your music.
NOTE: many people say that XMMS is old, buggy,no UTF-8 support, etc. Yes maybe all is true, but it's an audio player not a media library organizer, so it plays music and you listen, that's all and it does that job.
UPDATE:
Flac Plugin
We need to get the build dependencies
# sudo apt-get build-dep flac
You already know what's this ;)
# mkdir ~/build
# cd ~/build
Get flac's sources
# apt-get source flac
Another well known step:)
# cd flac-1.2.1
# ./configure
# make
It's enough to copy the plugin, not to install the whole flac stuff, this is good if will be flac update, note, an update wont break the plugin.
# cp src/plugin_xmms/.libs/libxmms-flac.so ~/.xmms/Plugins
# cd
# rm -rf ~/build
linux清理内存命令
Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.
To free pagecache:
- echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
- echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
- echo 3 > /proc/sys/vm/drop_caches
As this is a non-destructive operation, and dirty objects are not freeable, the user should run “sync” first in order to make sure all cached objects are freed.
This tunable was added in 2.6.16.
the last:echo 0 > /proc/sys/vm/drop_caches
should operator in root !
Thursday, July 16, 2009
Tuesday, July 14, 2009
TCP/IP 应用程序的通信连接模式
TCP/IP 起源于二十世纪 60 年代末美国政府资助的一个分组交换网络研究项目,它是一个真正的开放协议,很多不同厂家生产各种型号的计算机,它们运行完全不同的操作系统,但 TCP/IP 协议组件允许它们互相进行通信。现在 TCP/IP 已经从一个只供一些科学家使用的小实验网成长为一个由成千上万的计算机和用户构成的全球化网络,TCP/IP 也已成为全球因特网(Internet)的基础,越来越多的 TCP/IP 互联网应用和企业商业应用正在改变着世界。
TCP/IP 通讯协议采用了四层的层级模型结构(注:这与 OSI 七层模型不相同),每一层都调用它的下一层所提供的网络任务来完成自己的需求。TCP/IP 的每一层都是由一系列协议来定义的。这 4 层分别为:
- 应用层 (Application):应用层是个很广泛的概念,有一些基本相同的系统级 TCP/IP 应用以及应用协议,也有许多的企业商业应用和互联网应用。
- 传输层 (Transport):传输层包括 UDP 和 TCP,UDP 几乎不对报文进行检查,而 TCP 提供传输保证。
- 网络层 (Network):网络层协议由一系列协议组成,包括 ICMP、IGMP、RIP、OSPF、IP(v4,v6) 等。
- 链路层 (Link):又称为物理数据网络接口层,负责报文传输。
图1显示了 TCP/IP 层级模型结构,应用层之间的协议通过逐级调用传输层(Transport layer)、网络层(Network Layer)和物理数据链路层(Physical Data Link)而可以实现应用层的应用程序通信互联。
应用层需要关心应用程序的逻辑细节,而不是数据在网络中的传输活动。应用层其下三层则处理真正的通信细节。在 Internet 整个发展过程中的所有思想和着重点都以一种称为 RFC(Request For Comments)的文档格式存在。针对每一种特定的 TCP/IP 应用,有相应的 RFC 文档。一些典型的 TCP/IP 应用有 FTP、Telnet、SMTP、SNTP、REXEC、TFTP、LPD、SNMP、NFS、INETD 等。RFC 使一些基本相同的 TCP/IP 应用程序实现了标准化,从而使得不同厂家开发的应用程序可以互相通信。
图 1 TCP/IP 层级模型结构
然而除了这些已经实现标准化的系统级 TCP/IP 应用程序外,在企业商业应用和互联网应用开发中,存在着大量的商业应用程序通信互联问题。如图 1 显示,其中的应用层所包含应用程序主要可以分成两类,即系统级应用和商业应用,互联网商业应用是商业应用中的主要形式之一。
不同开发商和用户在开发各自商业应用通信程序时也存在有许多不同的设计方式。关于 TCP/IP 应用层以下的技术文献与书籍早已是汗牛充栋,但是关于 TCP/IP 应用本身,尤其是关于商业应用的通信设计模式技术讨论方面的文章还是比较少的。TCP/IP 应用通信设计模式实际上是在 TCP/IP 基础编程之上的一种应用编程设计方式,也属于一种应用层协议范畴,其可以包含有 TCP/IP 地址族模式设计、I/O 模式设计、通信连接模式设计以及通信数据格式设计等。鉴于目前讨论 TCP/IP 商业应用程序设计模式问题这方面的文章还很少见,本文尝试给出一些通信连接模式设计中共同的概念与一些典型的设计模式,在以后的文章中将继续讨论地址族模 式设计、I/O 模式设计、以及通信数据格式设计等方面的模式设计实现话题。
通信连接模式设计主要考虑内容有:
- 通信两端程序建立通信方式
- 通信连接方式
- 通信报文发送与接收方式
以下内容将介绍建立通信的 Client/Server 模型,然后逐一介绍通信连接模式设计所需要考虑的这些内容。
传输层接口 APIs 与 TCP/IP 应用程序 C/S 模型
TCP/IP 应用层位于传输层之上,TCP/IP 应用程序需要调用传输层的接口才能实现应用程序之间通信。目前使用最广泛的传输层的应用编程接口是套接字接口(Socket)。Socket APIs 是于 1983 年在 Berkeley Socket Distribution (BSD) Unix 中引进的。 1986 年 AT&T 公司引进了另一种不同的网络层编程接口 TLI(Transport Layer Interface),1988 年 AT&T 发布了一种修改版的 TLI,叫做 XTI(X/open Transport interface)。XTI/TLI 和 Socket 是用来处理相同任务的不同方法。关于 TCP/IP APIs 使用文章与书籍已相当多,本文则是侧重于如何组合使用这些 APIs 来进行 TCP/IP 应用程序连接模式设计,并归纳出几种基本应用连接模式。
如图 2 显示,应用层是通过调用传输层接口 APIs(Socket 或 XTI/TLI)来与传输层和网络层进行通信的。
图 2 传输层接口
不管是使用何种编程接口,要在两个机器或两个程序之间建立通信,通信双方必须建立互相一致的通信模式。如果双方的通信设计模式不一致就无法建立有效的通信连接。
以下是经常使用的 socket APIs,是建立 TCP/IP 应用程序的标准接口,也是影响 TCP/IP 应用程序通信方式的几个主要 APIs,不同 APIs 组合再结合系统调用可以实现不同方式的应用。Sockets 支持多种传输层和网络层协议,支持面向连接和无连接的数据传输,允许应用分布式工作。
- socket():是用来创建一个 socket,socket 表示通信中的一个节点,其可以在一个网络中被命名,用 socket 描述符表示,socket 描述符类似于 Unix 中的文件描述符。
- bind():是用来把本地 IP 层地址和 TCP 层端口赋予 socket。
- listen() :把未连接的 socket 转化成一个等待可连接的 socket,允许该 socket 可以被请求连接,并指定该 socket 允许的最大连接数。
- accept():是等待一个连接的进入,连接成功后,产生一个新的 socket 描述符,这个新的描述符用来建立与客户端的连接。
- connect():用来建立一个与服务端的连接。
- send():发送一个数据缓冲区,类似 Unix 的文件函数 write()。另外 sendto() 是用在无连接的 UDP 程序中,用来发送自带寻址信息的数据包。
- recv():接收一个数据缓冲区,类似 Unix 的文件函数 readI()。另外 recvfrom() 是用在无连接的 UDP 程序中,用来接收自带寻址信息的数据包。
- close():关闭一个连接
Sockets 是以 Client 和 Server 交互通信方式来使用的。典型的系统配置是把 Server 放在一台机器中,而把 Client 放在另一台机器中,Client 连接到 Server 交换信息。一个 socket 有一系列典型的事件流。例如,在面向连接的 Client/Server 模型中,Server 端的 socket 总是等待一个 Client 端的请求。要实现这个请求,Server 端首先需要建立能够被 Client 使用的地址,当地址建立后,Server 等待 Client 请求服务。当一个 Client 通过 socket 连接到 Server 后,Client 与 Server 之间就可以进行信息交换。Client/Server 是通信程序设计的基本模式。从软件开发的角度讲,TCP/IP 应用程序都是基于 Client/Server 方式的。注意本篇文章以下 Client/Server 概念是针对程序内部调用 Socket API 所讲的概念,与针对整个程序甚至针对机器而讲的客户端 / 服务器概念有所不同。用 Server APIs 建立的程序可以被当作客户端使用,用 Client APIs 建立的程序也可以被用作服务器端使用。建立 Server 需要的 APIs 有 socket(), bind(), listen(), accept(),建立 Client 需要的 APIs 有 Socket(), Connect()。在实际应用开发中,同一个程序里往往同时可以有 Client 和 Server 的代码,或者多种形式的组合。在实际应用编程中,针对 Socket APIs 不同有效组合,结合系统调用可以有多种复杂的设计变化。
面向连接的应用编程存在三类基本的不同级别的设计方式范畴,根据 Socket APIs 从上到下顺序依次是:
- Client/Server 通信建立方式
- Client/Server 通信连接方式
- Client/Server 通信发送与接收方式
下面内容以面向连接的 Socket 应用编程为例来说明这几种不同通信范畴的设计实现。
如果只有两台机器之间连接,那么一个是 Client,另一个是 Server,如下面图 3 所示。这是最简单的 TCP/IP 的应用,也是 TCP/IP 应用早期的 Peer to Peer (P2P) 概念。其流程基本如图 4 所示。
图 3 TCP/IP 应用单点 Client/Server
图 4 显示了 TCP/IP 应用编程最基本的 Client/Server 模式,显示了基本的 Client/Server 通信所需要调用的 Socket APIs 以及顺序。
图 4 TCP/IP 应用编程基本 Client/Server 模式
多个 Client 同时连接一个 Server 是 TCP/IP 应用的主流形式,如图 5 所示,其中 Client 连接数可以从几个到成千上万。
图 5 TCP/IP 应用多 Client 端的 Client/Server
由于 socket APIs 缺省方式下都是阻塞方式的,实现多个 Client 同时连接一个 Server 就需要特别的设计。其实现方式可以有多种不同的设计,这其中也涉及 I/O 模式设计。下面将展开介绍其中几种设计形式。
利用一个 Client 连接一个 Server 形式实现多 Client 连接
从程序设计角度讲,只要 Client 和 Server 端口是一对一形式,那么就属于一个 Client 连接一个 Server 形式。在处理多个 Client 端连接时,Server 端轮流使用多个端口建立多个 Client-Server 连接,连接关闭后,被释放端口可以被循环使用。在这种多连接形式中需要谨慎处理 Client 端如何获取使用 Server 端的可用端口。比如图 6 显示 Server 有一个服务于所有进程的进程可以先把 Server 端的可用端口发送给 Client 端,Client 端再使用该端口建立连接来处理业务。Server 针对每一个 Client 连接用一个专门的进程来处理。由于可用端口数有限,Server 用一个有限循环来处理每一个可用的端口连接。由于新端口需要用 bind() 来绑定,所以需要从 bind() 开始到 close() 结束都需要包含在循环体内。
图 6 利用一对一 Client-Server 模式实现多 Client 连接
使用多个 accept() 实现多 Client 连接
多进程 Server 一般有一个专注进程是服务于每一个连接的。当 Client 端完成连接后,专注进程可以循环被另外的连接使用。使用多个 accept() 也可以实现处理多 Client 连接。多 accept() 的 Server 也只有一个 socket(),一个 bind(),一个 listen(),这与通常情况一样。但是它建立许多工作子进程,每一个工作子进程都有 accept(),这样可以为每一个 Client 建立 socket 描述符。如图 7 所示,由于 accept() 连接成功后,会产生一个新的 socket 描述符,这样通过循环多进程利用 accept() 产生的多 socket 描述符就可以与多个 Client 进行连接通信。循环体是从 accept() 开始到 close() 结束的。
图 7 使用多 accept() 实现多 Client 连接
使用并发 Server 模式实现多 Client 连接
并发服务器模式曾经是 TCP/IP 的主流应用程序设计模式,得到广泛使用,目前互联网上仍有相当多的应用使用此种模式。其设计思路是在 accept 之后 fork 出一个子进程。因为 socket 会产生监听 socket 描述符 listenfd,accept 会产生连接 socket 描述符 connfd。连接建立后,子进程继承连接描述符服务于 Client,父进程则继续使用监听描述符等待另外一个 Client 的连接请求,以产生另外一个连接 socket 描述符和子进程。如图 8 所示,accept() 接收到一个 Client 连接后,产生一个新的 socket 描述符,通过 fork() 系统调用,用一个子进程来处理该 socket 描述符的连接服务。而父进程可以立即返回到 accept(),等待一个新的 Client 请求,这就是典型的并发服务器模式。并发服务器模式同时处理的最大并发 Client 连接数由 listen() 的第二个参数来指定。
图 8 TCP/IP 应用并发 Server
使用 I/O 多路技术实现多 Client 连接
以上三种连接设计,多 Server 端口、多 accept() 和并发服务器模式,都是通过 fork() 系统调用产生多进程来实现多 Client 连接的。使用 I/O 多路技术也可以同时处理多个输入与输出问题,即用一个进程同时处理多个文件描述符。I/O 多路技术是通过 select() 或 poll() 系统调用实现的。poll() 与 select() 功能完全相同,但是 poll() 可以更少使用内存资源以及有更少的错误发生。select() 调用需要与操作文件描述符集的 APIs 配合使用。select() 系统调用可以使一个进程检测多个等待的 I/O 是否准备好,当没有设备准备好时,select() 处于阻塞状态中,其中任一设备准备好后,select() 函数返回调用。select() API 本身也有一个超时时间参数,超时时间到后,无论是否有设备准备好,都返回调用。其流程如图 9 所示。在 socket APIs listen() 和 accept() 之间插入 select() 调用。使用这三个宏 FD_ZERO()、FD_CLR() 和 FD_SET(),在调用 select() 前设置 socket 描述符屏蔽位,在调用 select() 后使用 FD_ISSET 来检测 socket 描述符集中对应于 socket 描述符的位是否被设置。 FD_ISSET() 就相当通知了一个 socket 描述符是否可以被使用,如果该 socket 描述符可用,则可对该 socket 描述符进行读写通信操作。通常,操作系统通过宏 FD_SETSIZE 来声明在一个进程中 select() 所能操作的文件或 socket 描述符的最大数目。更详细的 I/O 多路技术实现,可以参考其他相关文献。
一个 Client 连接多个 Server 这种方式很少见,主要用于一个客户需要向多个服务器发送请求情况,比如一个 Client 端扫描连接多个 Server 端情况。如图 10 所示。此种方式设计主要是 Client 端应用程序的逻辑设计,通常需要在 Client 端设计逻辑循环来连接多个 Server,在此不做更多描述。
最近几年,对等网络技术 ( Peer-to-Peer,简称 P2P) 迅速成为计算机界关注的热门话题之一,以及影响 Internet 未来的科技之一。与早期点对点 (Peer to Peer) 的 Client/Server 模式不同,现在的 P2P 模式是指每个结点既可充当服务器,为其他结点提供服务,同时也可作为客户端享用其他结点提供的服务。实际上 P2P 模式仍然是基于 Client/Server 模式的,每个通信节点都既是 Server,又是 Client,P2P 是基于复杂 Client/Server 设计的 TCP/IP 应用。图 11 显示 P2P 模式下两个用户 PC 之间的对等连接。
图 11 P2P 模式
在技术上,P2P 本身是基于 TCP/IP Client/Server 技术的一种设计模式思想, P2P 也属于网络应用层技术,与 Web 和 FTP 等应用是并列的。只是 P2P 应用在设计实现上更要复杂的多。P2P 技术实现的协同工作是无需专门的服务器支持的 (Serverless),这里的服务器概念与 Client/Server 中的 Server 概念是不一样的。在传统意义上中心服务器机器上往往运行的是 TCP/IP 应用的 Server 端程序,所以传统意义上的 Server 概念在机器与应用上是重合的。如果更改 TCP/IP 的应用设计,使应用程序既可做 Server 又可做 Client,就可以实现无中心服务器的 P2P 模式。
在设计模式上,P2P 模式实现了网络终端用户不依赖中心服务器或者服务商而直接进行信息和数据交换的可能,因此 P2P 正在改变着整个互联网的一些基础应用,从而极大地增加了用户之间的信息沟通和交流能力。目前互联网的 P2P 应用与网络都正在飞速发展,一些典型的 P2P 应用程序比如有 BitTorrent, eDonkey 等,另外一些即时通信(IM)类软件比如 MSN、QQ 等也正在向无中心服务器模式转变。无中心服务器的 Internet 应用程序大大降低应用提供商的运营成本,而且减少人们对于 Server 稳定性的依赖。
Client/Server 通信方式建立后,下一步就需要考虑通信连接的方式,主要有两种方式的连接,即长连接通信与短连接通信。通信连接方式涉及到的 APIs 主要是 connect() 和 accept()。要实现某种 Client/Server 方式,就必须考虑用某种特定的连接方式。
短连接通信是指 Client 方与 Server 方每进行一次通信报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此种方式常用于多个 Client 连接一个 Server 情况,常用于机构与用户之间通信,比如 OLTP(联机事务处理)类应用。在短连接情况下,Client 端完成任务后,就关闭连接并退出。在 Server 端,可以通过循环 accept(),使 Server 不会退出,并连续处理 Client 的请求。图 12 显示了一般情况下短连接通信模式的 Socket 事件流,不同设计的连接多 Client 的 Server 有不同的循环流程。
图 12 短连接模式通信
长连接通信是指 Client 方与 Server 方先建立通讯连接,连接建立后不会断开,然后再进行报文发送和接收,报文发送与接收完毕后,原来连接不会断开而继续存在,因此可以连续进行交易报文的发送 与接收。这种方式下由于通讯连接一直存在,其 TCP/IP 状态是 Established,可以用操作系统的命令 netstat 查看连接是否建立。由于在长连接情况下,Client 端和 Server 端一样可以固定使用一个端口,所以长连接下的 Client 也需要使用 bind() 来绑定 Client 的端口。在长连接方式下,需要循环读写通信数据。为了区分每一次交易的通信数据,每一次交易数据常常需要在数据头部指定该次交易的长度,接收 API 需要首先读出该长度,然后再按该长度读出指定长度的字节。长连接方式常用于一个 Client 端对一个 Server 端的通讯,一般常用于机构与机构之间的商业应用通信,以处理机构之间连续的大量的信息数据交换。或者说可用于两个系统之间持续的信息交流情况。通常为了加 快两个系统之间的信息交流,通常还需要建立几条长连接的并行通信线路。图 13 显示了一般情况下长连接通信模式的 socket 事件流,可见其最大特点是 Client 和 Server 都有循环体,而且循环体只包含读写 APIs。
图 13 长连接模式通信
在通信数据发送与接收之间也存在不同的方式,即同步和异步两种方式。这里的同步和异步与 I/O 层次的同异步概念不同。主要涉及 socket APIs recv() 和 send() 的不同组合方式。
从应用程序设计的角度讲,报文发送和接收是同步进行的,既报文发送后,发送方等待接收方返回消息报文。同步方式一般需要考虑超时问题,即报文发出去后发送 方不能无限等待,需要设定超时时间,超过该时间后发送方不再处于等待状态中,而直接被通知超时返回。同步发送与接收经常与短连接通信方式结合使用,称为同 步短连接通信方式,其 socket 事件流程可如上面的图 12 所示。
从应用程序设计的角度讲,发送方只管发送数据,不需要等待接收任何返回数据,而接收方只管接收数据,这就是应用层的异步发送与接收方式。要实现异步方式, 通常情况下报文发送和接收是用两个不同的进程来分别处理的,即发送与接收是分开的,相互独立的,互不影响。异步发送与接收经常与长连接通信方式结合使用, 称为异步长连接通信方式。从应用逻辑角度讲,这种方式又可分双工和单工两种情况。
异步双工
异步双工是指应用通信的接收和发送在同一个程序中,而有两个不同的子进程分别负责发送和接收,异步双工模式是比较复杂的一种通信方式,有时候经常会出现在 不同机构之间的两套系统之间的通信。比如银行与银行之间的信息交流。它也可以适用在现代 P2P 程序中。如图 14 所示,Server 和 Client 端分别 fork 出两个子进程,形成两对子进程之间的连接,两个连接都是单向的,一个连接是用于发送,另一个连接用于接收,这样方式的连接就被称为异步双工方式连接。
图 14 长连接异步双工模式
异步单工
应用通信的接收和发送是用两个不同的程序来完成,这种异步是利用两对不同程序依靠应用逻辑来实现的。图 15 显示了长连接方式下的异步单工模式,在通信的 A 和 B 端,分别有两套 Server 和 Client 程序,B 端的 Client 连接 A 端的 Server,A 端的 Server 只负责接收 B 端 Client 发送的报文。A 端的 Client 连接 B 端的 Server,A 端 Client 只负责向 B 端 Server 发送报文。
图 15 长连接异步单工模式
综上所述,在实际 TCP/IP 应用程序设计中,就连接模式而言,我们需要考虑 Client/Server 建立方式、Client/Server 连接方式、Client/Server 发送与接收方式这三个不同级别的设计方式。实际 TCP/IP 应用程序连接模式可以是以上三类不同级别 Client/Server 方式的组合。比如一般 TCP/IP 相关书籍上提供的 TCP/IP 范例程序大都是同步短连接的 Client/Server 程序。有的组合是基本没有实用价值的,比较常用的有价值的组合是以下几种:
- 同步短连接 Server/Client
- 同步长连接 Server/Client
- 异步短连接 Server/Client
- 异步长连接双工 Server/Client
- 异步长连接单工 Server/Client
其中异步长连接双工是较为复杂的一种通信方式,有时候经常会出现在不同银行或不同城市之间的两套系统之间的通信,比如国家金卡工程。由于这几种通信方式比较固定,所以可以预先编制这几种通信方式的模板程序。
本文探讨了 TCP/IP 应用程序中连接模式的设计。在以后的文章中还将继续讨论 TCP/IP 应用程序设计中的其他方面的设计话题,包括地址族模式设计、I/O 模式设计、以及通信数据格式设计等。
come from:http://www.ibm.com/developerworks/cn/aix/library/0807_liugb_tcpip/
Linux 多线程应用中如何编写安全的信号处理函数
pthread_mutex 去保护全局变量。如果应用中使用了信号,而且信号的产生不是因为程序运行出错,而是程序逻辑需要,譬如 SIGUSR1、SIGRTMIN 等,信号在被处理后应用程序还将正常运行。在编写这类信号处理函数时,应用层面的开发人员却往往忽略了信号处理函数执行的上下文背景,没有考虑编写安全的 信号处理函数的一些规则。本文首先介绍编写信号处理函数时需要考虑的一些规则;然后举例说明在多线程应用中如何构建模型让因为程序逻辑需要而产生的异步信 号在指定的线程中以同步的方式处理。Linux 多线程应用中,每个线程可以通过调用 pthread_sigmask() 设置本线程的信号掩码。一般情况下,被阻塞的信号将不能中断此线程的执行,除非此信号的产生是因为程序运行出错如 SIGSEGV;另外不能被忽略处理的信号 SIGKILL 和 SIGSTOP 也无法被阻塞。
当一个线程调用 pthread_create() 创建新的线程时,此线程的信号掩码会被新创建的线程继承。
POSIX.1 标准定义了一系列线程函数的接口,即 POSIX threads(Pthreads)。Linux C 库提供了两种关于线程的实现:LinuxThreads 和 NPTL(Native POSIX Threads Library)。LinuxThreads 已经过时,一些函数的实现不遵循POSIX.1 规范。NPTL 依赖 Linux 2.6 内核,更加遵循 POSIX..1 规范,但也不是完全遵循。
基于 NPTL 的线程库,多线程应用中的每个线程有自己独特的线程 ID,并共享同一个进程ID。应用程序可以通过调用 kill(getpid(),signo) 将信号发送到进程,如果进程中当前正在执行的线程没有阻碍此信号,则会被中断,线号处理函数会在此线程的上下文背景中执行。应用程序也可以通过调用 pthread_kill(pthread_t thread, int sig) 将信号发送给指定的线程,则线号处理函数会在此指定线程的上下文背景中执行。
基于 LinuxThreads 的线程库,多线程应用中的每个线程拥有自己独特的进程 ID,getpid() 在不同的线程中调用会返回不同的值,所以无法通过调用 kill(getpid(),signo) 将信号发送到整个进程。
信号的产生可以是:
- 用户从控制终端终止程序运行,如 Ctrk + C 产生 SIGINT;
- 程序运行出错时由硬件产生信号,如访问非法地址产生 SIGSEGV;
- 程序运行逻辑需要,如调用
kill、raise产生信号。
因为信号是异步事件,即信号处理函数执行的上下文背景是不确定的,譬如一个线程在调用某个库函数时可能会被信号中断,库函数提前出错返回,转而去执 行信号处理函数。对于上述第三种信号的产生,信号在产生、处理后,应用程序不会终止,还是会继续正常运行,在编写此类信号处理函数时尤其需要小心,以免破 坏应用程序的正常运行。关于编写安全的信号处理函数主要有以下一些规则:
- 信号处理函数尽量只执行简单的操作,譬如只是设置一个外部变量,其它复杂的操作留在信号处理函数之外执行;
-
errno是线程安全,即每个线程有自己的errno,但不是异步信号安全。如果信号处理函数比较复杂,且调用了可能会改变errno值的库函数,必须考虑在信号处理函数开始时保存、结束的时候恢复被中断线程的errno值;
- 信号处理函数只能调用可以重入的 C 库函数;譬如不能调用
malloc(),free()以及标准 I/O 库函数等; - 信号处理函数如果需要访问全局变量,在定义此全局变量时须将其声明为
volatile,以避免编译器不恰当的优化。
从整个 Linux 应用的角度出发,因为应用中使用了异步信号,程序中一些库函数在调用时可能被异步信号中断,此时必须根据errno 的值考虑这些库函数调用被信号中断后的出错恢复处理,譬如socket 编程中的读操作:
rlen = recv(sock_fd, buf, len, MSG_WAITALL); |
如上文所述,不仅编写安全的异步信号处理函数本身有很多的规则束缚;应用中其它地方在调用可被信号中断的库函数时还需考虑被中断后的出错恢复处理。这让程序的编写变得复杂,幸运的是,POSIX.1 规范定义了sigwait()、 sigwaitinfo() 和 pthread_sigmask() 等接口,可以实现:
这种在指定的线程中以同步方式处理信号的模型可以避免因为处理异步信号而给程序运行带来的不确定性和潜在危险。
sigwait() 提供了一种等待信号的到来,以串行的方式从信号队列中取出信号进行处理的机制。sigwait()只等待函数参数中指定的信号集,即如果新产生的信号不在指定的信号集内,则 sigwait()继续等待。对于一个稳定可靠的程序,我们一般会有一些疑问:
- 多个相同的信号可不可以在信号队列中排队?
- 如果信号队列中有多个信号在等待,在信号处理时有没有优先级规则?
- 实时信号和非实时信号在处理时有没有什么区别?
笔者写了一小段测试程序来测试 sigwait 在信号处理时的一些规则。
清单 1. sigwait_test.c
#include |
程序编译运行在 RHEL4 的结果如下:
图 1. sigwait 测试程序执行结果
从以上测试程序发现以下规则:
- 对于非实时信号,相同信号不能在信号队列中排队;对于实时信号,相同信号可以在信号队列中排队。
- 如果信号队列中有多个实时以及非实时信号排队,实时信号并不会先于非实时信号被取出,信号数字小的会先被取出:如 SIGUSR1(10)会先于 SIGUSR2 (12),SIGRTMIN(34)会先于 SIGRTMAX (64), 非实时信号因为其信号数字小而先于实时信号被取出。
sigwaitinfo() 以及 sigtimedwait() 也提供了与 sigwait() 函数相似的功能。
在基于 Linux 的多线程应用中,对于因为程序逻辑需要而产生的信号,可考虑调用 sigwait()使用同步模型进行处理。其程序流程如下:
- 主线程设置信号掩码,阻碍希望同步处理的信号;主线程的信号掩码会被其创建的线程继承;
- 主线程创建信号处理线程;信号处理线程将希望同步处理的信号集设为
sigwait()的第一个参数。 - 主线程创建工作线程。
图 2. 在指定的线程中以同步方式处理异步信号的模型
以下为一个完整的在指定的线程中以同步的方式处理异步信号的程序。
主线程设置信号掩码阻碍 SIGUSR1 和 SIGRTMIN 两个信号,然后创建信号处理线程sigmgr_thread()和五个工作线程 worker_thread()。主线程每隔10秒调用 kill() 对本进程发送 SIGUSR1 和 SIGTRMIN 信号。信号处理线程 sigmgr_thread()在接收到信号时会调用信号处理函数 sig_handler()。
程序编译:gcc -o signal_sync signal_sync.c -lpthread
程序执行:./signal_sync
从程序执行输出结果可以看到主线程发出的所有信号都被指定的信号处理线程接收到,并以同步的方式处理。
清单 2. signal_sync.c
#include |
在基于 Linux 的多线程应用中,对于因为程序逻辑需要而产生的信号,可考虑使用同步模型进行处理;而对会导致程序运行终止的信号如 SIGSEGV 等,必须按照传统的异步方式使用 signal()、 sigaction()注册信号处理函数进行处理。这两种信号处理模型可根据所处理的信号的不同同时存在一个 Linux 应用中:
- 不要在线程的信号掩码中阻塞不能被忽略处理的两个信号 SIGSTOP 和 SIGKILL。
- 不要在线程的信号掩码中阻塞 SIGFPE、SIGILL、SIGSEGV、SIGBUS。
- 确保
sigwait()等待的信号集已经被进程中所有的线程阻塞。 - 在主线程或其它工作线程产生信号时,必须调用
kill()将信号发给整个进程,而不能使用pthread_kill()发送某个特定的工作线程,否则信号处理线程无法接收到此信号。 - 因为
sigwait()使用了串行的方式处理信号的到来,为避免信号的处理存在滞后,或是非实时信号被丢失的情况,处理每个信号的代码应尽量简洁、快速,避免调用会产生阻塞的库函数。
在开发 Linux 多线程应用中, 如果因为程序逻辑需要引入信号, 在信号处理后程序仍将继续正常运行。在这种背景下,如果以异步方式处理信号,在编写信号处理函数一定要考虑异步信号处理函数的安全; 同时, 程序中一些库函数可能会被信号中断,错误返回,这时需要考虑对 EINTR 的处理。另一方面,也可考虑使用上文介绍的同步模型处理信号,简化信号处理函数的编写,避免因为信号处理函数执行上下文的不确定性而带来的风险。
come from:http://www.ibm.com/developerworks/cn/linux/l-cn-signalsec/
Monday, July 13, 2009
Linux 线程模型LinuxThreads 和 NPTL的比较
当 Linux 最初开发时,在内核中并不能真正支持线程。但是它的确可以通过
clone() 系统调用将进程作为可调度的实体。这个调用创建了调用进程(calling process)的一个拷贝,这个拷贝与调用进程共享相同的地址空间。LinuxThreads 项目使用这个调用来完全在用户空间模拟对线程的支持。不幸的是,这种方法有一些缺点,尤其是在信号处理、调度和进程间同步原语方面都存在问题。另外,这个 线程模型也不符合 POSIX 的要求。线程 将应用程序划分成一个或多个同时运行的任务。线程与传统的多任务进程 之间的区别在于:线程共享的是单个进程的状态信息,并会直接共享内存和其他资源。同一个进程中线程之间的上下文切换通常要比进程之间的上下文切换速度更 快。因此,多线程程序的优点就是它可以比多进程应用程序的执行速度更快。另外,使用线程我们可以实现并行处理。这些相对于基于进程的方法所具有的优点推动 了 LinuxThreads 的实现。
LinuxThreads 最初的设计相信相关进程之间的上下文切换速度很快,因此每个内核线程足以处理很多相关的用户级线程。这就导致了一对一 线程模型的革命。
让我们来回顾一下 LinuxThreads 设计细节的一些基本理念:
LinuxThreads 非常出名的一个特性就是管理线程(manager thread)。管理线程可以满足以下要求:
- 系统必须能够响应终止信号并杀死整个进程。
- 以堆栈形式使用的内存回收必须在线程完成之后进行。因此,线程无法自行完成这个过程。
- 终止线程必须进行等待,这样它们才不会进入僵尸状态。
- 线程本地数据的回收需要对所有线程进行遍历;这必须由管理线程来进行。
- 如果主线程需要调用
pthread_exit(),那么这个线程就无法结束。主线程要进入睡眠状态,而管理线程的工作就是在所有线程都被杀死之后来唤醒这个主线程。
- 为了维护线程本地数据和内存,LinuxThreads 使用了进程地址空间的高位内存(就在堆栈地址之下)。
- 原语的同步是使用信号 来实现的。例如,线程会一直阻塞,直到被信号唤醒为止。
- 在克隆系统的最初设计之下,LinuxThreads 将每个线程都是作为一个具有惟一进程 ID 的进程实现的。
- 终止信号可以杀死所有的线程。LinuxThreads 接收到终止信号之后,管理线程就会使用相同的信号杀死所有其他线程(进程)。
- 根据 LinuxThreads 的设计,如果一个异步信号被发送了,那么管理线程就会将这个信号发送给一个线程。如果这个线程现在阻塞了这个信号,那么这个信号也就会被挂起。这是因为管理线程无法将这个信号发送给进程;相反,每个线程都是作为一个进程在执行。
- 线程之间的调度是由内核调度器来处理的。
LinuxThreads 的设计通常都可以很好地工作;但是在压力很大的应用程序中,它的性能、可伸缩性和可用性都会存在问题。下面让我们来看一下 LinuxThreads 设计的一些局限性:
- 它使用管理线程来创建线程,并对每个进程所拥有的所有线程进行协调。这增加了创建和销毁线程所需要的开销。
- 由于它是围绕一个管理线程来设计的,因此会导致很多的上下文切换的开销,这可能会妨碍系统的可伸缩性和性能。
- 由于管理线程只能在一个 CPU 上运行,因此所执行的同步操作在 SMP 或 NUMA 系统上可能会产生可伸缩性的问题。
- 由于线程的管理方式,以及每个线程都使用了一个不同的进程 ID,因此 LinuxThreads 与其他与 POSIX 相关的线程库并不兼容。
- 信号用来实现同步原语,这会影响操作的响应时间。另外,将信号发送到主进程的概念也并不存在。因此,这并不遵守 POSIX 中处理信号的方法。
- LinuxThreads 中对信号的处理是按照每线程的原则建立的,而不是按照每进程的原则建立的,这是因为每个线程都有一个独立的进程 ID。由于信号被发送给了一个专用的线程,因此信号是串行化的 —— 也就是说,信号是透过这个线程再传递给其他线程的。这与 POSIX 标准对线程进行并行处理的要求形成了鲜明的对比。例如,在 LinuxThreads 中,通过
kill()所发送的信号被传递到一些单独的线程,而不是集中整体进行处理。这意味着如果有线程阻塞了这个信号,那么 LinuxThreads 就只能对这个线程进行排队,并在线程开放这个信号时在执行处理,而不是像其他没有阻塞信号的线程中一样立即处理这个信号。 - 由于 LinuxThreads 中的每个线程都是一个进程,因此用户和组 ID 的信息可能对单个进程中的所有线程来说都不是通用的。例如,一个多线程的
setuid()/setgid()进程对于不同的线程来说可能都是不同的。 - 有一些情况下,所创建的多线程核心转储中并没有包含所有的线程信息。同样,这种行为也是每个线程都是一个进程这个事实所导致的结果。如果任何线程 发生了问题,我们在系统的核心文件中只能看到这个线程的信息。不过,这种行为主要适用于早期版本的 LinuxThreads 实现。
- 由于每个线程都是一个单独的进程,因此 /proc 目录中会充满众多的进程项,而这实际上应该是线程。
- 由于每个线程都是一个进程,因此对每个应用程序只能创建有限数目的线程。例如,在 IA32 系统上,可用进程总数 —— 也就是可以创建的线程总数 —— 是 4,090。
- 由于计算线程本地数据的方法是基于堆栈地址的位置的,因此对于这些数据的访问速度都很慢。另外一个缺点是用户无法可信地指定堆栈的大小,因为用户可能会意外地将堆栈地址映射到本来要为其他目的所使用的区域上了。按需增长(grow on demand) 的概念(也称为浮动堆栈 的概念)是在 2.4.10 版本的 Linux 内核中实现的。在此之前,LinuxThreads 使用的是固定堆栈。
NPTL,或称为 Native POSIX Thread Library,是 Linux 线程的一个新实现,它克服了 LinuxThreads 的缺点,同时也符合 POSIX 的需求。与 LinuxThreads 相比,它在性能和稳定性方面都提供了重大的改进。与 LinuxThreads 一样,NPTL 也实现了一对一的模型。
Ulrich Drepper 和 Ingo Molnar 是 Red Hat 参与 NPTL 设计的两名员工。他们的总体设计目标如下:
- 这个新线程库应该兼容 POSIX 标准。
- 这个线程实现应该在具有很多处理器的系统上也能很好地工作。
- 为一小段任务创建新线程应该具有很低的启动成本。
- NPTL 线程库应该与 LinuxThreads 是二进制兼容的。注意,为此我们可以使用
LD_ASSUME_KERNEL,这会在本文稍后进行讨论。 - 这个新线程库应该可以利用 NUMA 支持的优点。
与 LinuxThreads 相比,NPTL 具有很多优点:
- NPTL 没有使用管理线程。管理线程的一些需求,例如向作为进程一部分的所有线程发送终止信号,是并不需要的;因为内核本身就可以实现这些功能。内核还会处理每个 线程堆栈所使用的内存的回收工作。它甚至还通过在清除父线程之前进行等待,从而实现对所有线程结束的管理,这样可以避免僵尸进程的问题。
- 由于 NPTL 没有使用管理线程,因此其线程模型在 NUMA 和 SMP 系统上具有更好的可伸缩性和同步机制。
- 使用 NPTL 线程库与新内核实现,就可以避免使用信号来对线程进行同步了。为了这个目的,NPTL 引入了一种名为 futex 的新机制。futex 在共享内存区域上进行工作,因此可以在进程之间进行共享,这样就可以提供进程间 POSIX 同步机制。我们也可以在进程之间共享一个 futex。这种行为使得进程间同步成为可能。实际上,NPTL 包含了一个
PTHREAD_PROCESS_SHARED宏,使得开发人员可以让用户级进程在不同进程的线程之间共享互斥锁。 - 由于 NPTL 是 POSIX 兼容的,因此它对信号的处理是按照每进程的原则进行的;
getpid()会为所有的线程返回相同的进程 ID。例如,如果发送了SIGSTOP信号,那么整个进程都会停止;使用 LinuxThreads,只有接收到这个信号的线程才会停止。这样可以在基于 NPTL 的应用程序上更好地利用调试器,例如 GDB。 - 由于在 NPTL 中所有线程都具有一个父进程,因此对父进程汇报的资源使用情况(例如 CPU 和内存百分比)都是对整个进程进行统计的,而不是对一个线程进行统计的。
- NPTL 线程库所引入的一个实现特性是对 ABI(应用程序二进制接口)的支持。这帮助实现了与 LinuxThreads 的向后兼容性。这个特性是通过使用
LD_ASSUME_KERNEL实现的,下面就来介绍这个特性。
正如上面介绍的一样,ABI 的引入使得可以同时支持 NPTL 和 LinuxThreads 模型。基本上来说,这是通过 ld (一个动态链接器/加载器)来进行处理的,它会决定动态链接到哪个运行时线程库上。
举例来说,下面是 WebSphere® Application Server 对这个变量所使用的一些通用设置;您可以根据自己的需要进行适当的设置:
LD_ASSUME_KERNEL=2.4.19:这会覆盖 NPTL 的实现。这种实现通常都表示使用标准的 LinuxThreads 模型,并启用浮动堆栈的特性。LD_ASSUME_KERNEL=2.2.5:这会覆盖 NPTL 的实现。这种实现通常都表示使用 LinuxThreads 模型,同时使用固定堆栈大小。
我们可以使用下面的命令来设置这个变量:
export LD_ASSUME_KERNEL=2.4.19
注意,对于任何 LD_ASSUME_KERNEL 设置的支持都取决于目前所支持的线程库的 ABI 版本。例如,如果线程库并不支持 2.2.5 版本的 ABI,那么用户就不能将 LD_ASSUME_KERNEL 设置为 2.2.5。通常,NPTL 需要 2.4.20,而 LinuxThreads 则需要 2.4.1。
如果您正运行的是一个启用了 NPTL 的 Linux 发行版,但是应用程序却是基于 LinuxThreads 模型来设计的,那么所有这些设置通常都可以使用。
大部分现代 Linux 发行版都预装了 LinuxThreads 和 NPTL,因此它们提供了一种机制来在二者之间进行切换。要查看您的系统上正在使用的是哪个线程库,请运行下面的命令:
$ getconf GNU_LIBPTHREAD_VERSION
在我的ubuntu9.04下面的输出结果:
NPTL 2.9
ARM VS X86 的时代
嵌入式处理器从十年前的群雄并起到现在ARM和Intel两强争雄,波澜壮阔,演绎了一出纷繁芜杂而又让人感慨万千的大戏!
自从英特尔携凌动杀入嵌入式市场,就与在该市场获得广泛应用的ARM及相关DSP平台展开激烈的市场争夺战。
两大平台相互学习,似乎将殊途同归,应用的交叉会更多。不同的人会选择不同的方案。将来,可能是用英特尔的平台也可以,用ARM的平台也可以。但有一点很重要,硬件只不过是一个躯壳,软件才是产生价值的灵魂。项目会不会有竞争力,并不取决于你采用的是英特尔还是ARM,我认为取决于Design,即软件的价值,还有商业模式、生态环境和创新的功能。在这方面,苹果的成功就是一个例子。我们今天都是站在巨人的肩膀上前行,一个idea出来,一个创新出来了,附加值产生了,这个附加值很可能就是软件带来的。
Friday, July 3, 2009
linux socket select笔记
select()机制提供一个fd_set数据结构,实际上是long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一socket或文件可读,下面具体解释:
struct fd_set可以理解为一个集合,这个集合中存放的是文件描述符(file descriptor),即文件句柄,这可以是我们所说的普通意义的文件,当然Unix下任何设备、管道、FIFO等都是文件形式,全部包括在内,所以毫无疑问一个socket就是一个文件,socket句柄就是一个文件描述符。fd_set集合可以通过一些宏由人为来操作,比如清空集合 FD_ZERO(fd_set *),将一个给定的文件描述符加入集合之中FD_SET(int ,fd_set *),将一个给定的文件描述符从集合中删除FD_CLR(int ,fd_set*),检查集合中指定的文件描述符是否可以读写FD_ISSET(int ,fd_set* )。
struct timeval是一个大家常用的结构,用来代表时间值,有两个成员,一个是秒数,另一个是毫秒数。
使用select需要包含以下linux头文件:
#include
#include /sys/times.h/
#include /sys/select.h/
函数原型:
int select(
int nfds,
fd_set * readfds,
fd_set * writefds,
fd_set * exceptfds,
struct timeval * timeout);
参数解释:
ndfs:select监视的文件句柄数,视进程中打开的文件数而定,即所有文件描述符的最大值加1。
readfds:select监视的可读文件句柄集合。readfds是指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的读变化的,即我们关心是否可以从这些文件中读取数据了,如果这个集合中有一个文件可读,select就会返回一个大于0的值,表示有文件可读,如果没有可读的文件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的读变化。
writefds: select监视的可写文件句柄集合。writefds是指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的写变化的,即我们关心是否可以向这些文件中写入数据了,如果这个集合中有一个文件可写,select就会返回一个大于0的值,表示有文件可写,如果没有可写的文件,则根据timeout参数再判断是否超时,若超出timeout的时间,select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的写变化。
exceptfds:select监视的异常文件句柄集合。
timeout:本次select()的超时结束时间。(见/usr/sys/select.h,可精确至百万分之一秒)timeout是select的超时时间,这个参数至关重要,它可以使select处于三种状态,第一,若将NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变化为止;第二,若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值;第三,timeout的值大于0,这就是等待的超时时间,即 select在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值下述。
返回值:
负值:select错误
正值:某些文件可读写或出错
0:等待超时,没有可读写或错误的文件
当readfds或writefds中映象的文件可读或可写或超时,本次select()就结束返回。程序员利用一组系统提供的宏在select()结束时便可判断哪一文件可读或可写。对Socket编程特别有用的就是readfds。
几只相关的宏解释如下:
FD_ZERO(fd_set *fdset):清空fdset与所有文件句柄的联系。
FD_SET(int fd, fd_set *fdset):建立文件句柄fd与fdset的联系。
FD_CLR(int fd, fd_set *fdset):清除文件句柄fd与fdset的联系。
FD_ISSET(int fd, fdset *fdset):检查fdset联系的文件句柄fd是否可读写,>0表示可读写。
(关于fd_set及相关宏的定义见/usr/include/sys/types.h)
编程框架:
int main()
{
int sock;
FILE *fp;
struct fd_set fds;
struct timeval timeout={2,0}; //select等待2秒,2秒轮询,要非阻塞就置0
char buffer[256]={0}; //256字节的接收缓冲区
/* 假定已经建立TCP连接,具体过程忽略,
*UDP同理,主机ip和port都已经给定,要写的文件已经打开
*/
sock=socket(...);
bind(...);
fp=fopen(...);
while(1)
{
FD_ZERO(&fds); //每次循环都要清空集合,否则不能检测描述符变化
FD_SET(sock,&fds); //添加描述符
FD_SET(fp,&fds); //同上
maxfdp=sock>fp?sock+1:fp+1; //描述符最大值加1
switch(select(maxfdp,&fds,&fds,NULL,&timeout)) //select使用
{
case -1:
exit(-1);
break; //select错误,退出程序
case 0:
break; //再次轮询
default:
if(FD_ISSET(sock,&fds)) //测试sock是否可读,即是否网络上有数据
{
recvfrom(sock,buffer,256,.....); //接受网络数据
if(FD_ISSET(fp,&fds)) //测试文件是否可写
fwrite(fp,buffer...); //写入文件
buffer清空;
}// end if
break;
}// end switch
}//end while
}//end main
Friday, February 13, 2009
判断/dev目录下指定的某个设备是否存在
如何判断在/dev目录下指定的某个设备是否存在呢?比如判断/dev/ttyS0是否存在可用如下代码:
access(dev_fn,O_RDWR);
if (errno == ENOENT)
{ /* judge file exist or not */
system("mknod /dev/audio_alg c 240 0");
}
if ((dev_fd = open(dev_fn,O_RDWR)) <= 0)
{
perror("/dev/audio_alg");
return -1;
}
Thursday, January 8, 2009
Wednesday, December 24, 2008
Tuesday, December 23, 2008
Linux文件系统层次结构标准
为了避免在Linux也产生同样的问题,在Linux面世不久,就开始了对Linux文件系统进行标准化的活动,于1994年推出了名为 FSSTND(Filesystem Standard)的Linux文件系统层次结构标准。之后,FSSTND标准吸引了UNIX社团的开发人员,他们把FSSTND扩大到UNIX系 统,FSSTND就变为FHS (Filesystem Hierarchy Standard)。2001年3月,FHS 2.2版本发布,2004年1月29日发行了最新版本2.3。
FHS标准使得众多的Linux发布包有了可以遵循的标准,使得软件和用户可以预测已经安装了的文件和目录的位置。它定义了如下的内容。
定义了文件系统中每个区域的用途
定义了所需要的最小构成的文件和目录
给出了例外处理和矛盾的特殊例子
| 目录 | 内容和用途 |
|---|---|
| / | 根目录 |
| /bin | 一般用户使用的命令 |
| /boot | 放置内核及LILO、GRUB等导引程序(bootloader)的文件,用于启动。 |
| /dev | 硬盘,分区,键盘,鼠标,USB,tty等所有的设备文件都放在这个目录。 |
| /etc | 系统的所有配置文件都存放在此目录中。 |
| /home | 用户空间,所有的用户都是用此空间。 |
| /lib | 共享连接库,如C库和C编译器等等。 |
| /media | 挂接CD-ROM等设备的目录 |
| /mnt | 移动设备文件系统的挂点 |
| /opt | 存放后来追加的用户应用程序 |
| /root | 管理员之家 |
| /sbin | 存放系统管理所需要的命令 |
| /tmp | 临时文件目录,重新启动时被清除 |
| /usr | 存放只能读的命令和其他文件。 /usr/X11R6 X Window系统 /usr/bin 用户和管理员的标准命令 /usr/include c/c++等各种开发语言环境的标准include文件 /usr/lib 应用程序及程序包的连接库 /usr/local/ 系统管理员安装的应用程序目录 /usr/local/share 系统管理员安装的共享文件 /usr/sbin 用户和管理员的标准命令 /usr/share 存放使用手册等共享文件的目录 /usr/share/dict 存放词表的目录(选项) /usr/share/man 系统使用手册 /usr/share/misc 一般数据 /usr/share/sgml SGML数据(选项) /usr/share/xml XML数据(选项) |
| /var | 存放应用程序数据和日志记录的目录,例如,Apache Web服务器的文档一般就放在/var/www/html下。 /var/cache 应用程序缓存目录 /var/account 处理账号日志(选项) /var/crash 系统错误信息(选项) /var/games 游戏数据 /var/lib 各种状态数据 /var/lock 文件锁定纪录 /var/log 日志记录 /var/mail 电子邮件 /var/opt /opt目录的变量数据 /var/run 进程的标示数据 /var/spool 存放电子邮件,打印任务等的队列目录。 /var/spool/rwho /var/tmp 临时文件目录 /var/yp NIS等黄页数据(选项) |
参考资料
FHS 2.3
http://www.pathname.com/fhs/
Friday, December 5, 2008
ubuntu 8.04/8.10搭建lxr源代码检索系统
01) LXRng依赖许多package,因此需要安装相关软件,使用如下命令:
$ sudo aptitude install git-core postgresql-8.3 postgresql-client-8.3 libxapian15 libsearch-xapian-perl apache2 libapache2-mod-perl2 libcgi-simple-perl libcgi-ajax-perl libhtml-parser-perl libtemplate-perl libterm-progressbar-perl libdevel-size-perl libdbd-pg-perl ctags
2) 数据库增加有用最大权限的使用者帐号,指令为:
$ sudo -i
$ su - postgres
$ createuser user # Answer "yes" when asked about superprivileged access
$ exit
$ exit
3) 建立数据库,并将http服务器使用者设定为数据库的一般使用者,因此在建立www-data帐号遇到的问题全部回答"N",指令为:
$ createdb lxrng
$ createuser www-data
4) 由LXR的repository取得LXRng,指令为:
$ cd ~
$ git-clone git://lxr.linux.no/git/lxrng.git
5) 启动LXRng设定,指令为:
$ cd ~/lxrng
$ cp lxrng.conf-dist lxrng.conf
$ vim lxrng.conf
6) 将以下字符串注释掉
use LXRng::Repo::Git;
my $gitrepo = LXRng::Repo::Git
->new('/var/lib/lxrng/repos/linux-2.6/.git',
release_re => qr/^v[^-]*$/,
author_timestamp => 0);
my $search = LXRng::Search::Xapian->new('/var/lib/lxrng/text-db/linux-2.6');
7) 新增加以下新的字符串,指令为:
use LXRng::Repo::Plain;
my $plainrepo = LXRng::Repo::Plain->new('/home/user/src/linux-source');
my $search = LXRng::Search::Xapian->new('/home/user/src/linux-source-2.6.26-textdb');
8) 修改下列字符串:postgresq
'repository' => $gitrepo, --改为--> 'repository' => $plainrepo,
'base_url' => 'http://lxr-test.linpro.no/lxr', --改为--> 'base_url' => 'http://localhost/lxr', [13]
'cache' => '/var/lib/lxrng/cache', --改为--> 'cache' => '/home/user/lxrng/cache',
'ver_list' => [$gitrepo->allversions], --改为--> 'ver_list' => ['v2.6.26'],
'ver_default' => 'v2.6.20.3', --改为--> 'ver_default' => 'v2.6.26',
9) save&quite(emacs or vim in this example)
10) 下载Linux kernel source code并将目录设置为7)8)中设定好的目录相符合
$ mkdir ~/src
$ cp linux-2.6.26.tar.gz ~/src
$ cd ~/src
$ tar -xzvf linux-2.6.26.tar.gz
$ mkdir linux-source
$ mkdir linux-source/v2.6.26
$ mv linux-source-2.6.26/* linux-source/v2.6.26
$ mkdir linux-source-2.6.26-textdb
$ mkdir ~/lxrng/cache
$ chmod 777 ~/lxrng/cache -R
$ chmod 777 ~/lxrng/webroot -R
$ make -C ~/lxrng/webroot/.static/gfx
11) 生成Linux-2.6.26的XR,指令为:
$ cd ~/lxrng
$ ./lxr-db-admin linux --init
$ ./lxr-genxref linux
12) 设置Apache2
$ cp apache2-site.conf-dist-mod_perl apache2-site.conf
$ sudo ln -s ~/lxrng/apache2-site.conf /etc/apache2/sites-enabled/010-lxrng
$ vim apache2-site.conf
将所有"@@LXRROOT@@"替换成"/home/user/lxrng"
将"@@LXRURL@@"替换成"lxr"
13) 重新启动Apache2
$ sudo /etc/init.d/apache2 reload
14) 使用浏览器打开http://localhost/lxr即可进行代码检索。
如果要更换domain name,可将现有的"localhost"改为"somewhere.com",只需要将"lxrng.conf"中的"base_url"替换之后再执行./lxr-genxref linux即可,这次的执行时间十分短,因为XR都已经存在,现在即可使用浏览器打开新的网址"http://somewhere.com/lxr"检索代码。至此,配置完毕,希望对大家有用。
Sunday, November 30, 2008
MPEG-4 AVC/H.264编码器荟萃
--------------------------------SOFTWARE CODECS:---------------------
Ateme H.264/MPEG-4 AVC Codec (Ateme)No download on original site:http://www.ateme.com/products/h264.phpSee 30 day trial of Nero Digital (with Nero Recode) available from: http://www.nerodigital.com/eng/index.html
VSS H.264 Video Codec (Vanguard Software Solutions, Inc.)Trial available, VfW.http://www.vsofts.com/h264/codecs.html
Elecard OneClick Compressor & Elecard AVC/H.264 Decoder Package (Elecard)21-day free trial. Have H.264 SDKhttp://www.elecard.com/products/oneclick.shtml
Mainconcept H.264 (MainConcept AG)Trial available on download pagehttp://www.mainconcept.com/h264_encoder.shtmlUse Elecard Encoder H.264 from March 2005.
Moonlight H.264 Video Codec (Moonlight Cordless LTD.)21-day evaluation, DirectX filter.http://www.moonlight.co.il/products/...r/oneclickavc/This codec was developed with Elecard team.
SONY Video Editor Vegas 6c with AVC support (Sony Corp.) NEW!!!30-days evaluation.http://www.sonymediasoftware.com/pro...ct.asp?PID=965
QuickTime 7 H.264 (Apple Computer, Inc.)Integrated. Who test it? Any remarks welcome!http://www.apple.com/quicktime/technologies/h264/
FastVDO H.264 (FastVDO LLC)Demo has decode time limit of 5 min.http://www.fastvdo.com/H.264.html
LEAD H.264 Video codec (LEAD Technologies)Only demo, but you can buy codec online (100$). Who test it?http://www.leadcodecs.com/Codecs/LEAD-H264.htm
Compression Master 3 (Popwire/Teleca AB) H264 encoder is all a part of Popwire's Compression Master. Demo soft available (encoding is limited to 20 seconds). http://www.popwire.com/product_info....&products_id=2
SVM H.264 Decoder Kit & MKi DVD Converter (Pegasus Information Technology Inc.)H.264 encoder and decoder with non standart format.http://www.h-264.com/downloads.htm
AVC Alliance free demo player (AVC Alliance, written by Philips Electronics)Poor but free.http://www.avc-alliance.nl/main/downloads.htm
Intel IPP H.264 codec (Intel Corporation) Intel IPP Library containe now H.264 encoder and decoder. Higher quality codecs are promised in 5.0 version (released now)http://www.intel.com/cd/software/pro.../ipp/index.htm
PowerEncoder MPEG-4 AVC (CyberLink Corp.) NEW!!!Available in online shop.http://www.cyberlink.com/multi/produ...in_43_ENU.html
ATI H.264 (ATI Technologies Inc.)No download. Software only and +HW support. Very fast codec by our tests.http://www.ati.com/technology/h264.html
Mpegable AVC Codec (dicas digital image coding GmbH)No download, VfWhttp://www.mpegable.com/show/mpegableavc.htmlOld version from free-codecs:http://www.codec-download.com/module...=getit&lid=436
Expert H.264 (PixelTools Corporation)Download on requesthttp://www.pixeltools.com/experth264.html
Softstream H.264/MPEG-4 (Media Excel)Audio & Video encoders ane decoders. Evaluation copy on requesthttp://www.mediaexcel.com/products.htm
MPEG-2/HDV/H.264 software (KDDI R&D Labs. Inc.)No download. MPEG related products also with H.264 supporthttp://avs.kddilabs.jp/mpeg/indexe.html
Fraunhofer IIS H.264 Codec (Fraunhofer IIS)No download.http://www.iis.fraunhofer.de/amm/download/mpeg4/
UBLive-264-C64 (UB Video Incorporated)Demo available on request.http://www.ubvideo.com/mainmenu.html
Sorenson Squeeze 4 Compression Suite (Sorenson)No download. Converter.http://www.sorensonmedia.com/solutio...d/mpg4_win.php
Sonic’s HD-Series AVC encoder (Sonic Solutions)No download. Only press release now.http://www.sonic.com/about/press/new.../hdseries.aspx
Enchansed sklmp4 (Pascal Massimino)No download. Announce of 264 development.http://skal.planet-d.net/coding/mpeg4codec.html
NEX VISION H.264 (NEX VISION)No download.http://www.nexvision.fr/
Hughes Network Systems H.264 (Hughes Network Systems, LLC) No download. Own Win&Linux codec for internal usagehttp://www.hns.com/HNS/Doc/0/MGD6UC9...3-04_IPoS.html
Imagicity H.264/AVC codec (Imagicity, UK) NEW!!!No download. Speed optimization claimed.http://www.imagicity.com/products/products.htm
-----------------------OPEN SOURCE:---------------------
x264 (free, supported by VideoLAN)OPEN SOURCE. Good publically available high profile encoder. Developers declare "early development stage", but encode results are one of the best.http://www.videolan.org/x264.html
http://x264.nl/
JM 9.6 reference H.264 encodec (free, supported by Joint Video Team ISO+ITU-T)OPEN SOURCE. Can be used only for stream testing.http://bs.hhi.de/~suehring/tml/
libavcodec H.264 Decoder (Project FFMPEG)OPEN SOURCE. Permanently updated decoder.http://ffmpeg.sourceforge.net/index.php
Hdot264 Pre-Alpha (Project Hdot264)OPEN SOURCE.http://sourceforge.net/projects/hdot264/
t264 (Project t264)OPEN SOURCE.http://sourceforge.net/projects/t264
Minimal H.264 decoder (by Martin Fiedler)OPEN SOURCE. Basic decoder.http://www-user.tu-chemnitz.de/~mfie/stuff/SA/
---See also Software Developments Kits for software codec usage:---
Elecard AVC&MPEG2 Encoder SDK (Elecard)MPEG2 and H.264 Video Encoder and Decoders other components within the DirectShow® technology.http://www.elecard.com/products/encoder_sdk.shtml
MainConcept H.264 SDK (MainConcept AG)Windows, Apple, Linux and TI DSP supported.http://developer.mainconcept.com/h264-sdk.html
LEADTOOLS Multimedia Developer SDKs (LEAD Technologies, Inc)Support for many-many formats, including H.264 http://www.leadtools.com/SDK/Multime...Products-n.htm
MPEG SDK "MP-Factory" (KDDI R&D Labs. Inc.)SDK with H.264, HDV, MPEG-1,-2, and -4 supporthttp://avs.kddilabs.jp/mpeg/mpfs32/indexe.html
VSS H.264 SDK (Vanguard Software Solutions, Inc.)Based on there codec. Windows and Linux support.http://www.vsofts.com/h264/sdk.html
Pegasus H.264 SDK Development Kits (Pegasus)Looks like simple codec, but prefilters declared.http://www.h-264.com/Products.htm
-------------------------HARDWARE IMPLEMENTED:---------------------
Sony PlayStation Portable (Sony Computer Entertainment Inc.)Product: Support H.264/MPEG-4 AVC Main Profile Level3 decoding.http://www.us.playstation.com/consoles.aspx?id=4
See also Image Converter 2 Plus:http://www.jp.sonystyle.com/Nws/Soft...710489100.html
VSX 300 Videoconferencing Terminal with H.264 support (Polycom Inc)Product: Biggest HW videoconferencing company, prepare many solutions with 264 supporthttp://www.polycom.com/products_serv...5-6197,00.html
Tandberg EN5930 (Tandberg Television)Product for videoconferencing. Who test it? I have bad review.http://www.tandbergtv.com/productview.asp?n=65
Tandberg Telecom - video communication (Tandberg Telecom)Product for videoconferencing, supports H.264 baseline profile.http://www.tandberg.net/collateral/w...apers/H264.pdf
4Caster MPEG-4 / H.264 Encoder (Envivio, Inc.)Product: Hardware box encoderhttp://www.envivio.com/products/4caster.htmlhttp://www.envivio.com/products/4caster_se.html (software, no download)
Tut Systems MPEG-4 AVC (Tut Systems, Inc.)Product: Hardware transcoder box.http://www.tutsys.com/pdflibrary/pdf...AVC_2_9_05.pdf
Hardware MGW 5100 (Optibase, Inc.)Product: Hardware box encoderhttp://www.optibase.com/Content.aspx?id=38
Harmonic DiviCom® MV 100 Encoder (Harmonic Inc. )Product: Hardware box encoder http://www.harmonicinc.com/view_csd_...m?classID=1010
SkyStream Mediaplex & iPlex (SkyStream Networks , inc.) Product: Hardware box encoder. Platforms contain the AVC Encoder Submodule, press release only http://www.skystream.com/press/2005/041805-mpeg4.asp
E42 - H264 DVB over IP Broadcast Encoder (StreamTel Corporation) Product: Hardware box encoder. Broadcast-Grade real time H264 DVB IP streaming encoder http://www.streamtel.com/streamtel/p...st_Encoder.htm
Darim MV401EXP-H264 Encoder and MV410EXP Decoder (Darim Vision Co., Ltd.)Product: Hardware box Encoding/Streaming systems http://www.darimmedia.com/products/mv401exp-h264.php
Mayah I [io] 8000 series (MAYAH Communications)Product: Hardware box. Plan AVC availability in Q3 '05. http://www.mayah.com/products/io-8000a.htm
Thales ARGOS MPEG-4 Encoder (Thales Broadcast & Multimedia, Inc.)Product: Hardware box. Plan AVC from July 05. http://www-db.thomcastcom.ext.coltfr..._ID=1&P_ID=221
ViBE MPEG-4 AVC (Thomson)Chip: modular hardware series of encodershttp://www.thomsongrassvalley.com/pr...encoder_mpeg4/
Broadcom chips (Broadcom Corp. former Sandvideo)Chip with H.264 HD / decoding onlyhttp://www.broadcom.com/products/Cab...-Chips/BCM7411
Sentivision H.264/AVC Decoder (Sentivision, Japan) Chip with H.264 HD / decoding only / only for TI DSP'shttp://www.sentivision.com/products/h264/h264-en.html
SA AVC Encoder (Scientific Atlanta)Product: Transmission system (for satellite TV)http://www.saeurope.com/products/customerhome.htm
H.264 VLE4000 (LSI Logic Corp. former: VideoLocus)Chips with 264 supporthttp://www.lsilogic.com/products/vid...g/vle4000.html
Modulus Video SDTV, HDTV Encoder (Modulus Video, Inc.)Chips. Declarations only now. License H.264 from LSI Logic.http://modulusvideo.com/main.php?Page=12
BSP 15 (System-on-chip) (Equator Technologies, Inc.)Chips. No exact codec info.http://www.equator.com/solutions/digitalmedia.html
BT Exact H.264 Suite (BT Exact)temporarily not availablehttp://www.btexact.com/technologies/...iles?doc=42895
Surveillance Real Time H.264 Encoders (DSP Research, Inc.)Several chips implementation.http://www.dspr.com/www/products/overview_video.htmhttp://www.dspr.com/www/support/down...o_download.htm
VP3-PMC / Hardware TwinPEG Pro (Vitec Multimedia)Chips. TMS320DM642TMDSP & etchttp://www.vitecmm.com/product.php?id=41
WWComs H.264 Codecs (W&W Communications Inc.)Several chips implementation (TI DM64x, C64xx, Freescale DSPs).http://www.wwcoms.com/products/h264_codec.htmhttp://www.wwcoms.com/products/codec/bc264.htm
CX2418x H.264 Video Decoder IC (Conexant Systems, Inc.)HW Decoder with Main & High Profile (on CX24182)http://www.conexant.com/products/entry.jsp?id=920
Sigma Designs HD decoder (Sigma Designs, Inc.)HW HD Decoder based on SMP8630 familyhttp://www.sigmadesigns.com/products/SMP8630series.htm
Cradle Technologies H.264 (Cradle Technologies, Inc.) HW Main profile Encoder based on CT3600 MDSP familyhttp://www.cradle.com/products/asw_ct3600_h264.shtml
STMicroelectronics H.264 (STMicroelectronics)HW HD High Profile decoderhttp://www.st.com/stonline/products/...e/bd/11102.htm
PacketVideo H.264 (PacketVideo Corp.) HW Base Profile encoder/decoder on ARM/OMAP/DM642http://www.packetvideo.com/solutions/
Friday, November 14, 2008
Android 开发参考资源
Android开发者论坛
http://www.androidin.com/
google主站:
http://code.google.com/android/
E文文档
http://code.google.com/android/documentation.html
Android中国开发者团队google groups
http://groups.google.com/group/android-developers-zh
Android中国开发论坛
http://www.android.org.cn/
Android中文圈子
http://www.1android.cn/
中文社区
http://www.androidcn.net
http://www.androidcn.net/wiki
http://www.techfree.cn
google groups
http://groups.google.com/group/android-developers
Other Open Handset Alliance Project
http://code.google.com/p/android/downloads/list
OHA:开放手持设备联盟官方网站
http://www.openhandsetalliance.com/
GPhone论坛
http://bbs.gphone999.com/
Linux基金会,别忘了多看看
http://www.linux-foundation.org/
Mobile Linux
http://www.linux-foundation.org/en/Mobile_Linux
OMA: 开放移动联盟
http://www.linux-foundation.org/
LiPS Forum
http://www.lipsforum.org/
CE Linux Forum
http://tree.celinuxforum.org/
Gnome Mobile and Embedded (GMAE)
http://www.gnome.org/mobile/
LiMo Foundation
https://www.limofoundation.org/sf/sfmain/do/home
Ubuntu Mobile
https://lists.ubuntu.com/archive ... 007-May/000289.html
Mobile & Internet Linux Project
http://www.moblin.org/
国外网站
http://www.androidboards.com/
http://www.androidev.com/
http://androidcommunity.com/
http://anddev.org/
Wednesday, November 12, 2008
Vimperator---把Firefox变成Vim
Vim是Vi编辑器的Improved版本,是linux下最为强大的编辑工具。它与我们传统的文字编辑器不同的是,它对键盘的利用率几乎达到极致。因此 熟练的人操作vim你会看到他的手指在键盘上面飞动,编辑效率及其高效,当然对于普通人,特别是初学者来说,Vim可能显得比较别扭。
Vimperator引入了和Vim类似的概念来操作浏览器。例如它也有命令模式和插入模式,在命令模式下,我们可以t键然后输入一个url,这样就可以 在新标签页打开。或者按住o键输入url可以在当前标签打开。标签切换使用ctrl+P/N来左右切换,按住大写的U可以撤销刚才不小心关闭的页面,按d 删除键可以关闭当前标签,页面浏览时使用和Vim一摸一样的方式,都是hjkl来上下左右移动屏幕.试用了一下,发现用起来真的非常舒服,不用在键盘,鼠 标或者触摸屏上来回切换.
它还有其他一些功能,可以快速添加收藏夹呀,还有命令自动补全,等等.
具体的帮助信息可以按住:号,切换到命名行模式,然后输入help来看官方的帮助文档,或者直接按F1也行.需要注意的是初始安装完之后,默认情况下是会 把菜单和工具栏隐藏起来的,你可以输入:号切换到命令行模式,然后输入set guioptions+=mT来开启.只要退出时按两下大写的Z就可以保存当前设置退出.
Monday, November 3, 2008
常用的APT命令参数
特简单记录于此,以备不时之需
apt-cache search package 搜索包
apt-cache show package 获取包的相关信息,如说明、大小、版本等
apt-get install package 安装包
apt-get install package - - reinstall 重新安装包
apt-get -f install 修复安装"-f = ——fix-missing"
apt-get remove package 删除包
apt-get remove package - - purge 删除包,包括删除配置文件等
apt-get update 更新源
apt-get upgrade 更新已安装的包
apt-get dist-upgrade 升级系统
apt-get dselect-upgrade 使用 dselect 升级
apt-cache depends package 了解使用依赖
apt-cache rdepends package 是查看该包被哪些包依赖
sudo apt-get build-dep package 安装相关的编译环境
apt-get source package 下载该包的源代码
sudo apt-get clean && sudo apt-get autoclean 清理无用的包
sudo apt-get check 检查是否有损坏的依赖
apt-get update——在修改/etc/apt/sources.list或者/etc/apt/preferences之後运行该命令。此外您需要定期运行这一命令以确保您的软件包列表是最新的。
apt-get install packagename——安装一个新软件包(参见下文的aptitude)
apt-get remove packagename——卸载一个已安装的软件包(保留配置文件)
apt-get –purge remove packagename——卸载一个已安装的软件包(删除配置文件)
dpkg –force-all –purge packagename 有些软件很难卸载,而且还阻止了别的软件的应用,就可以用这个,不过有点冒险。
apt-get autoclean apt会把已装或已卸的软件都备份在硬盘上,所以如果需要空间的话,可以让这个命令来删除你已经删掉的软件
apt-get clean 这个命令会把安装的软件的备份也删除,不过这样不会影响软件的使用的。
apt-get upgrade——更新所有已安装的软件包
apt-get dist-upgrade——将系统升级到新版本
apt-cache search string——在软件包列表中搜索字符串
dpkg -l package-name-pattern——列出所有与模式相匹配的软件包。如果您不知道软件包的全名,您可以使用“*package-name-pattern*”。
aptitude——详细查看已安装或可用的软件包。与apt-get类似,aptitude可以通过命令行方式调用,但仅限于某些命令——最常见的有安装和卸载命令。由于aptitude比apt-get了解更多信息,可以说它更适合用来进行安装和卸载。
apt-cache showpkg pkgs——显示软件包信息。
apt-cache dumpavail——打印可用软件包列表。
apt-cache show pkgs——显示软件包记录,类似于dpkg –print-avail。
apt-cache pkgnames——打印软件包列表中所有软件包的名称。
dpkg -S file——这个文件属于哪个已安装软件包。
dpkg -L package——列出软件包中的所有文件。
apt-file search filename——查找包含特定文件的软件包(不一定是已安装的),这些文件的文件名中含有指定的字符串。apt-file是一个独立的软件包。您必须 先使用apt-get install来安装它,然後运行apt-file update。如果apt-file search filename输出的内容太多,您可以尝试使用apt-file search filename | grep -w filename(只显示指定字符串作为完整的单词出现在其中的那些文件名)或者类似方法,例如:apt-file search filename | grep /bin/(只显示位于诸如/bin或/usr/bin这些文件夹中的文件,如果您要查找的是某个特定的执行文件的话,这样做是有帮助的)。
apt-get autoclean——定期运行这个命令来清除那些已经卸载的软件包的.deb文件。通过这种方式,您可以释放大量的磁盘空间。如果您的需求十分迫切,可 以使用apt-get clean以释放更多空间。这个命令会将已安装软件包裹的.deb文件一并删除。大多数情况下您不会再用到这些.debs文件,因此如果您为磁盘空间不足 而感到焦头烂额,这个办法也许值得一试。