以前做嵌入式的时候用到过linux,不过大部分操作都在ubuntu的界面环境下完成,使用一些简单的命令来配置,编译linux内核,现在要在终端下工作,所以整理一些自己平时遇到的问题,有不对不足的地方还望大家指出。
目录:
(1)Shell built-in 变量
$0 当前shell程序的名字
$1 ~ $9 命令行上的第一到第九个参数
$# 命令行上的参数个数
$* 命令行上的所有参数
$@ 分别用双引号引用命令行上的所有参数
$$ 当前进程的进程标识号(PID)
$? 上一条命令的退出状态
$! 最后一个后台进程的进程标识号
系统变量只能引用不能修改!
(2)linux alias详解
一、简介
linux alias是命令的一种别称,输入
alias
可以看到像下面这样的结果:
alias vi="vim"
也即,输入vi后,被自动定向到vim这个命令了。alias的作用就是,可以简写命令。
二、修改alias
若要添加自己的alias,格式如下
alias la="ls -al --color=auto"
三、修改配置文件
上述命令,在用户登出后就无效了,可以用修改配置文件的办法,使每次都能够自动生效。
若要修改用户(而非全部用户)自己的alias,可以修改~/.bashrc文件
vii ~/.bashrc
再最后面加上你自己定义的alias,如
alias la="ls -al --color=auto"
这个修改,要下次登录的时候才能生效。想要即刻生效,可以输入
source ~/.bashrc
四、常用的alias
这个根据个人爱好了,可以google之~找到你自己喜欢的alias
五、修改全局的alias可以修改系统配置文件,我这里就不说了。
还有其他的方面知识,如交互式、非交互式登录的配置文件,这个也不多说了。
(3)source命令详解
source FileName
作用:在当前bash环境下读取并执行FileName中的命令。
注:该命令通常用命令“.”来替代。
如:source .bash_rc 与 . .bash_rc 是等效的。
source命令(从 C Shell 而来)是bash shell的内置命令。点命令,就是个点符号,(从Bourne
Shell而来)是source的另一名称。同样的,当前脚本中配置的变量也将作为脚本的环境,source(或点)命令通常用于重新执行刚修改的初始化
文档,如 .bash_profile 和 .profile 等等。例如,假如在登录后对 .bash_profile 中的 EDITER 和
TERM 变量做了修改,则能够用source命令重新执行 .bash_profile 中的命令而不用注销并重新登录。
比如您在一个脚本里export $KKK=111 ,假如您用./a.sh执行该脚本,执行完毕后,您运行 echo $KKK
,发现没有值,假如您用source来执行,然后再echo
,就会发现KKK=111。因为调用./a.sh来执行shell是在一个子shell里运行的,所以执行后,结构并没有反应到父shell里,但是
source不同他就是在本shell中执行的,所以能够看到结果
source命令的一个妙用
在编译核心时,常常要反复输入一长串命令,如
make mrproper
make menuconfig
make dep
make clean
make bzImage
.......
这些命令既长,又繁琐。而且有时候容易输错,浪费你的时间和精力。如果把这些命令做成一个文件,让它自动按顺序执行,对于需要多次反复编译核心的用
户来说,会很方便。用source命令可以办到这一点。它的作用就是把一个文件的内容当成是shell来执行。先在/usr/src/linux-
2.4.20目录下建立一个文件,取名为make_command:
在其中输入如下内容:
make mrproper &&
make menuconfig &&
make dep &&
make clean &&
make bzImage &&
make modules &&
make modules_install &&
cp arch/i386/boot/bzImge /boot/vmlinuz_new &&
cp System.map /boot &&
vi /etc/lilo.conf &&
lilo -v
文件建立好之后,以后每次编译核心,只需要在/usr/src/linux-2.4.20下输入
source make_command
就行了。这个文件也完全可以做成脚本,只需稍加改动即可。这里主要是让大家理解source的用法。如果你用的不是lilo来引导系统,可以把最后两句话去掉。配置你自己的引导程序来引导新内核。
shell编程中的命令有时和C语言是一样的。&&表示与,||表示或。把两个命令用&&联接起来,如
make mrproper && make menuconfig
,表示要第一个命令执行成功才能执行第二个命令。对执行顺序有要求的命令能保证一旦有错误发生,下面的命令不会盲目地继续执行。
(4)Linux ps1 ps2 ps3 ps4详解
用户登录Linux系统的字符界面后,就会出现"#"或"$"等命令提示符,比如"[root@pxe root]# “、"[oracle@db1 ~]$”或是 “-bash-3.00#”等等。
通过设置环境变量PS1、PS2、PS3以及PS4来自定义用户命令行的字符显示。如果要长期永久性修改提示符,可以将修改提示符的命令添加到$HOME/.profile或$HOME/.bash_profile文件中。
1. PS1
PS1是主提示符变量,也是默认提示符变量。默认值"/s-/v/$“,显示shell类型和版本。
基本上通过设置PS1来定义命令行提示字符即可,最常用的需求就是显示登录的用户名、主目录、主机名等等,举个例子如下:
显示用户名,主机名和动态显示当前目录
-bash-3.00# export PS1="[/u@/h /w]"
[root@MagicLinux ~]cd /etc
[root@MagicLinux /etc]
注意:如果当前目录是用户的HOME目录,则显示"~"
PS1变量可以使用的参数值有如下:
/d |
代表日期,格式为weekday month date,例如:"Mon Aug 1" |
/H |
完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux |
/h |
仅取主机的第一个名字,如上例,则为fc4,.linux则被省略 |
/t |
显示时间为24小时格式,如:HH:MM:SS |
/T |
显示时间为12小时格式 |
/A |
显示时间为24小时格式:HH:MM |
/u |
当前用户的账号名称 |
/v |
BASH的版本信息 |
/w |
完整的工作目录名称。家目录会以 ~代替 |
/W |
利用basename取得工作目录名称,所以只会列出最后一个目录 |
/# |
下达的第几个命令 |
/$ |
提示字符,如果是root时,提示符为:# ,普通用户则为:$ |
/[ |
字符"[" |
/] |
字符"]" |
/! |
命令行动态统计历史命令次数 |
2. PS2
PS2是副提示符变量,默认值是''> ''。
PS2一般使用于命令行里较长命令的换行提示信息,比如:
默认设置
-bash-3.00# rpm -q gcc make binutils openmotif setarch compat-db compat-gcc /
> compat-gcc-c++ compat-libstdc++ compat-libstdc++-devel
自定义设置
-bash-3.00# export PS2="PS2 => "
-bash-3.00# rpm -q gcc make binutils openmotif setarch compat-db compat-gcc /
PS2 => compat-gcc-c++ compat-libstdc++ compat-libstdc++-devel
3. PS3,PS4
这两个环境变量可能用得不多,不研究了。如果有兴趣,可以学习bash里面的简介。
(可以百度 linux超級技巧,第33章專門講述了ps3,ps4)
PS3 The value of this parameter is used as the prompt for the select command (see SHELL GRAMMAR above).
PS4 The value of this parameter is expanded as with PS1 and the value is printed before each command bash displays during an execution trace. The first character of PS4 is replicated multiple times, as neces-sary, to indicate multiple levels of indirection. The default is ''+ ''.
(5)linux id 命令详解
功能说明:显示用户的ID,以及所属群组的ID。
语 法:id [-gGnru][--help][--version][用户名称]
补充说明:id会显示用户以及所属群组的实际与有效ID。
若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户的ID。
参 数:
-g或--group 显示用户所属群组的ID。
-G或--groups 显示用户所属附加群组的ID。
-n或--name 显示用户,所属群组或附加群组的名称。
-r或--real 显示实际ID。
-u或--user 显示用户ID。
-help 显示帮助。
-version 显示版本信息。
(6)umask详解
umask=022中"022"是八进制的写法,如果换成二进制是000010010
在unix中文件权限是三类用户,三种权限。三类用户分别是文件所有者user(u),文件所有者所在主群组group(g)、其它用户others(o),三种权限分别是起读read(r)、写write(w)、执行execute(x)。
如果一个文件的权限如下:所有者有读写的权限,群组有读和执行权限、其它用户有读权限,可以写成:
rw-xr-r--
其中前三位指明了所有者的权限、中间三位指明了组权限、最后三位指明了其它用户的权限。我们用ls -l可以看到文件权限详情,列出来的是10位,最前一位如果是d表示是子目录。
事实上,新建文件夹或文件的权限是由所谓基本码减去称之为umask的屏蔽位得到的。
按照规定:文件夹的基本码是rwxrwxrwx(777),文件的基本码是rw-rw-rw-(666)
而屏蔽位则是在/etc/profile(所有人)或者~/.profile中设定的。如果上述文件中皆无设定则默认就是022
我们可以在shell下面输入umask命令查看/修改当前的系统屏蔽位。
$ umask 033
$ umask
$ 033
$ umask 022
因此新建文件夹是777-022=755(rwxr-xr-x),新建文件是666-022=644(rw-r--r--)。
$ mkdir test
$ touch test.txt
$ ll
$ drwxr-xr-x ... test/
$ -rw-r--r-- ... test.txt
所以我们可以通过修改umask来改变新建文件文、件夹的权限.
(7)linux trap命令 详解
trap命令用于指定在接收到信号后将要采取的动作。常见的用途是在脚本程序被中断时完成清理工作。不过,这次我遇到它,是因为客户有个需求:从终端访问服务器的用户,其登陆服务器后会自动运行某个命令,例如打开应用(命令写在.bashrc等文件中),最后退出,并断开连接;期间是不能允许其使用Ctrl+C等中断退出应用,而回到Shell环境,否则可能会带来安全问题。
当然,解决的方式有很多,如在应用中屏蔽中断信号、使用chroot方式访问等。但这些方法都有一些限制,如需要修改应用,让telnet等支持chroot方式(ssh可支持chroot)等。而使用trap也是一种比较好的解决方法。
一、关于信号
历史上,shell总是用数字来代表信号,而新的脚本程序应该使用信号的名字,它们保存在用#include命令包含进来的signal.h头文件中,在使用信号名时需要省略SIG前缀。
kill和trap等都可以看到信号编号及其关联的名称。“信号”是指那些被异步发送到一个程序的事件。默认情况下,它们通常会终止一个程序的运行。
引用
# trap -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1
36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5
40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9
44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5
60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1
64) SIGRTMAX
附录中有个说明文档。
二、trap的使用
1、运行格式
trap命令的参数分为两部分,前一部分是接收到指定信号时将要采取的行动,后一部分是要处理的信号名。
trap command signal
它有三种形式分别对应三种不同的信号回应方式。
第一种:
trap "commands" signal-list
当脚本收到signal-list清单内列出的信号时,trap命令执行双引号中的命令。
第二种:
trap signal-list
trap不指定任何命令,接受信号的默认操作,默认操作是结束进程的运行。
第三种:
trap " " signal-list
trap命令指定一个空命令串,允许忽视信号,我们用到的就是这一种。
※ 请记住,脚本程序通常是以从上到下的顺序解释执行的,所以必须在你想保护的那部分代码以前指定trap命令。
2、测试
按照用户的要求,我们需要屏蔽的是HUP INT QUIT TSTP几个信号。所以,可以运行:
# trap "" HUP INT QUIT TSTP
这个时候,可以试试打开一个持续的命令,然后中断其运行,例如:
# tail -f /var/log/messages
接着,试试用Ctrl+C或 Ctrl+\来中断试试,会程序是不会退出的。
3、恢复信号
如果想恢复的话,可以用Ctrl+Z把程序放到后台,然后运行:
# trap : HUP INT QUIT TSTP
然后,用ps -ef看看其PID号,bg 1让程序继续运行,最后用kill杀掉即可。
4、其他
您也可以试试运行:
# trap "echo 'Hello World' " HUP INT QUIT TSTP
这样,当您运行Ctrl+C等中断时,会自动运行echo命令,结果就是现实Hello World字符串:
引用
# tail -f /var/log/messages
May 18 16:57:54 192.168.228.153 dhcpd: DHCPREQUEST for 192.168.228.221 from 00:1d:72:92:d4:68 via eth0
May 18 16:57:54 192.168.228.153 dhcpd: DHCPACK on 192.168.228.221 to 00:1d:72:92:d4:68 via eth0
[root@mail ~]# Hello World
※ 注意,这方式并不能屏蔽中断,敲入Ctrl+C等信息后,仍以默认行为动作的,也就是退出程序,仅会再运行一个额外的命令而已。
三、附录
1、中断按键
不同的终端类型、Shell版本其中断的按键是不同的,甚至还可以自定义,这可通过stty命令查询:
引用
# stty -a
speed 38400 baud; rows 30; columns 111; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ; eol2 = ; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
^就是Ctrl的缩写。
2、信号详情
引用
名称 默认动作 说明
SIGHUP 终止进程 终端线路挂断
SIGINT 终止进程 中断进程
SIGQUIT 建立CORE文件 终止进程,并且生成core文件
SIGILL 建立CORE文件 非法指令
SIGTRAP 建立CORE文件 跟踪自陷
SIGBUS 建立CORE文件 总线错误
SIGSEGV 建立CORE文件 段非法错误
SIGFPE 建立CORE文件 浮点异常
SIGIOT 建立CORE文件 执行I/O自陷
SIGKILL 终止进程 杀死进程
SIGPIPE 终止进程 向一个没有读进程的管道写数据
SIGALarm 终止进程 计时器到时
SIGTERM 终止进程 软件终止信号
SIGSTOP 停止进程 非终端来的停止信号
SIGTSTP 停止进程 终端来的停止信号
SIGCONT 忽略信号 继续执行一个停止的进程
SIGURG 忽略信号 I/O紧急信号
SIGIO 忽略信号 描述符上可以进行I/O
SIGCHLD 忽略信号 当子进程停止或退出时通知父进程
SIGTTOU 停止进程 后台进程写终端
SIGTTIN 停止进程 后台进程读终端
SIGXGPU 终止进程 CPU时限超时
SIGXFSZ 终止进程 文件长度过长
SIGWINCH 忽略信号 窗口大小发生变化
SIGPROF 终止进程 统计分布图用计时器到时
SIGUSR1 终止进程 用户定义信号1
SIGUSR2 终止进程 用户定义信号2
SIGVTALRM终止进程 虚拟计时器到时
1) SIGHUP本信号在用户终端连接(正常或非正常)结束时发出,通常是在终端的控制进程结束时,通知同一session内的各个作业,这时它们与控制终端不再关联.
2) SIGINT程序终止(interrupt)信号,在用户键入INTR字符(通常是Ctrl-C)时发出
3) SIGQUIT和SIGINT类似,但由QUIT字符(通常是Ctrl-\)来控制.进程在因收到SIGQUIT退出时会产生core文件,在这个意义上类似于一个程序错误信号.
4) SIGILL执行了非法指令.通常是因为可执行文件本身出现错误,或者试图执行数据段.堆栈溢出时也有可能产生这个信号.
5) SIGTRAP由断点指令或其它trap指令产生.由debugger使用.
6) SIGABRT程序自己发现错误并调用abort时产生.
7) SIGIOT在PDP-11上由iot指令产生,在其它机器上和SIGABRT一样.
8) SIGBUS非法地址,包括内存地址对齐(alignment)出错. eg:访问一个四个字长的整数,但其地址不是4的倍数.
9) SIGFPE在发生致命的算术运算错误时发出.不仅包括浮点运算错误,还包括溢出及除数为0等其它所有的算术的错误.
10) SIGKILL用来立即结束程序的运行.本信号不能被阻塞,处理和忽略.
11) SIGUSR1留给用户使用
12) SIGSEGV试图访问未分配给自己的内存,或试图往没有写权限的内存地址写数据.
13) SIGUSR2留给用户使用
14) SIGPIPE Broken pipe
15) SIGALRM时钟定时信号,计算的是实际的时间或时钟时间. alarm函数使用该信号.
16) SIGTERM程序结束(terminate)信号,与SIGKILL不同的是该信号可以被阻塞和处理.通常用来要求程序自己正常退出. shell命令kill缺省产生这个信号.
17) SIGCHLD子进程结束时,父进程会收到这个信号.
18) SIGCONT让一个停止(stopped)的进程继续执行.本信号不能被阻塞.可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作.例如,重新显示提示符.
19) SIGSTOP停止(stopped)进程的执行.注意它和terminate以及interrupt的区别:该进程还未结束,只是暂停执行.本信号不能被阻塞,处理或忽略.
20) SIGTSTP停止进程的运行,但该信号可以被处理和忽略.用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号
21) SIGTTIN当后台作业要从用户终端读数据时,该作业中的所有进程会收到SIGTTIN信号.缺省时这些进程会停止执行.
22) SIGTTOU类似于SIGTTIN,但在写终端(或修改终端模式)时收到.
23) SIGURG有紧急数据或out-of-band数据到达socket时产生.
24) SIGXCPU超过CPU时间资源限制.这个限制可以由getrlimit/setrlimit来读取/改变
25) SIGXFSZ超过文件大小资源限制.
26) SIGVTALRM虚拟时钟信号.类似于SIGALRM,但是计算的是该进程占用的CPU时间.
27) SIGPROF类似于SIGALRM/SIGVTALRM,但包括该进程用的CPU时间以及系统调用的时间.
28) SIGWINCH窗口大小改变时发出.
29) SIGIO文件描述符准备就绪,可以开始进行输入/输出操作.
30) SIGPWR Power failure
对于2和3信号量好理解,屏蔽ctrl+c和ctrl+\。但是1信号量到底什么作用呢?
转自http://blog.csdn.net/cugxueyu/archive/2008/01/16/2046565.aspx
SIGHUP信号与控制终端
UNIX中进程组织结构为 session (会话)包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程。一个session可能会有一个session首进程,而一个session首进程可能会有一个控制终端。一个进程组可能会有一个进程组首进程。进程组首进程的进程ID与该进程组ID相等。这儿是可能会有,在一定情况之下是没有的。与终端交互的进程是前台进程,否则便是后台进程。
SIGHUP会在以下3种情况下被发送给相应的进程:
1、终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进程)
2、session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程
3、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。
系统对SIGHUP信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。
下面观察几种因终端关闭导致进程退出的情况,在这儿进程退出是因为收到了SIGHUP信号。login shell是session首进程。
首先写一个测试程序,代码如下:
#include <stdio.h>
#include <signal.h>
char **args;
void exithandle(int sig)
...{
printf("%s : sighup received ",args[1]);
}
int main(int argc,char **argv)
...{
args = argv;
signal(SIGHUP,exithandle);
pause();
return 0;
}
程序中捕捉SIGHUP信号后打印一条信息,pause()使程序暂停。
编译后的执行文件为sigtest。
1、命 令:sigtest front > tt.txt
操 作:关闭终端
结 果:tt.txt文件的内容为front : sighup received
原 因: sigtest是前台进程,终端关闭后,根据上面提到的第1种情况,login shell作为session首进程,会收到SIGHUP信号然后退出。根据第2种情况,sigtest作为前台进程,会收到login shell发出的SIGHUP信号。
2、命 令:sigtest back > tt.txt &
操 作:关闭终端
结 果:tt.txt文件的内容为 back : sighup received
原 因: sigtest是提交的job,根据上面提到的第1种情况,sigtest会收到SIGHUP信号。
3、命 令:写一个shell,内容为[sigtest &],然后执行该shell
操 作:关闭终端
结 果:ps -ef | grep sigtest会看到该进程还在,tt文件为空
原 因:执行该shell时,sigtest作为job提交,然后该shell退出,致使sigtest变成了孤儿进程,不再是当前session的job了,因此sigtest即不是session首进程也不是job,不会收到SIGHUP。同时孤儿进程属于后台进程,因此login shell退出后不会发送SIGHUP给sigtest,因为它只将该信号发送给前台进程。第3条说过若进程组变成孤儿进程组的时候,若有进程处于停止状态,也会收到SIGHUP信号,但sigtest没有处于停止状态,所以不会收到SIGHUP信号。
4、命 令:nohup sigtest > tt
操 作:关闭终端
结 果:tt文件为空
原 因: nohup可以防止进程收到SIGHUP信号
至此,我们就清楚了何种情况下终端关闭后进程会退出,何种情况下不会退出。
要想终端关闭后进程不退出有以下几种方法,均为通过shell的方式:
1、编写shell,内容如下
trap "" SIGHUP #该句的作用是屏蔽SIGHUP信号,trap可以屏蔽很多信号
sigtest
2、nohup sigtest可以直接在命令行执行,
若想做完该操作后继续别的操作,可以 nohup sigtest &
3、编写shell,内容如下
sigtest &
其实任何将进程变为孤儿进程的方式都可以,包括fork后父进程马上退出。
(8)Linux stty
在linux/unix平台上的sqlplus中,如果输错了字符,要想删除,习惯性的按下backspace键后,发现非但没有删除想要删掉的字符,还多出了两个字符^H。当 然,我们可以同时按下ctrl+backspace键来删除,但对于习惯了用backspace来删除的用户,这样很不爽。这可以通过修改tty终端的设置来实现backspace删除功能。通过使用stty命令,就可以查看或者修改终端的按键设置。
例如,设置backspace为删除键:
[oracle10g@linux]$ stty erase ^h
如果要改回使用ctrl+backspace为删除键
[oracle10g@linux]$ stty erase ^?
如果需要重启后自动设置终端,可以将上述命令加入到profile中。
可以通过stty -a命令来查看所有的终端设置。下面是在linux下执行的输出:
[oracle10g@linux]$ stty -a
speed 38400 baud; rows 66; columns 132; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
其中:
参看引用链接:
源文档 <http://blog.csdn.net/cheungjustin/article/details/5678679>
源文档 <http://blog.csdn.net/cyberreality/article/details/6838788>
源文档 <http://blog.chinaunix.net/space.php?uid=21825410&do=blog&id=416073>
源文档 <http://blog.csdn.net/cheungjustin/article/details/5825213>
源文档 <http://powerclark.iteye.com/blog/564821>
源文档 <http://www.cnblogs.com/dkblog/archive/2011/09/04/2166571.html>
源文档 <http://blog.csdn.net/holandstone/article/details/6738769>
源文档 <http://blog.chinaunix.net/uid-26667139-id-3064721.html>