一、
nm命令:查看哪些函数被包含在目标文件、函数库或可执行文件里。
ldd命令来查看一个程序需要的共享库。
标准c语言函数库libc.so.6
二、
shell很适合编写一些执行相对简单的任务的小工具,更强调的是易于配置、维护和可移植性,而不是很看重执行的效率。
shell语法:
变量:所有变量都被看作字符串并以字符串来存储,即使它们被赋值为数值时也是如此。shell和一些工具程序会在需要时把数值型字符串转换为对应的数值以对它们进行操作。
read命令将用户的输入赋值给一个变量。这个命令需要一个参数,即准备读入用户输入数据的变量名。
使用引号:字符串通常都被放在双引号中,以防止变量被空白符分开,同时又运行$扩展。
一些环境变量: $0 (shell脚本的名字), $# (传递给脚本的参数个数),$$ (shell脚本的进程号) ,$* or $@ (列出所有参数,有点区别在IFS的设置上,$@不受IFS值得影响,常用)。
1.条件
shell的布尔判断命令[ 或 test
e.g.
if test -f fred.c
then
...
fi
或者
if [ -f fred.c ]
then
...
fi
test命令可以使用的条件类型可以归为3类:字符串比较、算术比较与文件有关的条件测试。
2.控制结构
if语句
for语句
shell脚本程序中所有的变量扩展都是在脚本程序被执行时而不是在编写它时完成的。所以,变量声明中的语法错误只有在执行时才会被发现。
while语句
until语句
case语句
命令列表:AND(&&) OR(||) 符合短路径求值
语句块:如果想在某些只允许单个语句的地方使用多条语句,可以把它们括在花括号{}中来构造一个语句块。
3.函数
function_name(){
statements
}
把所有函数定义都放在任何一个函数调用之前,就可以保证所有的函数在被调用之前就被定义了。
可以使用local关键字在shell函数中声明局部变量。
4.命令
内部命令执行的效率相对外面命令高。
通常,当一个脚本执行一条外部命令或脚本程序时,它会创建一个新的环境(一个子shell),命令将在这个新环境中执行,在命令执行完毕后,这个环境被丢弃,留下退出码给父shell。source命令和点命令在执行脚本程序使用的是调用该脚本程序的同一个shell,而且允许执行的脚本程序改变当前环境,即使脚本程序执行结束后,这些改变仍然有效。
5.export命令
默认情况下,在一个shell中被创建的变量在这个shell调用的下级shell中是不可用的。可使用export命令将作为它参数的变量导出到子shell中,并使之在子shell有效。
6.expr命令
`....` or $((...))
7.set命令
set $(命令)
8.shift命令把所有参数变量左移一个位置。$2变为$1...$1被丢弃。$0保持不变。
9.trap命令 trap command signal
10.可以通过圆括号来强制测试和操作符的优先级。由于圆括号对shell来说有特殊的含义,必须使用反斜杠来引用圆括号。
find 。。。 \( -newer X -o -name "_*" \) 表示搜索的文件比文件X要新,或者文件名以下划线开头。
e.g. find . -newer X -type f -exec ls -l {} \;
使用find命令在系统中搜索文件,而使用grep命令在文件中搜索字符串。
一种常用用法是在使用find命令时,将grep作为传递给-exec的一条命令。
$(命令) 的结果就是其中命令的输出。
$((准备求值得表达式))
参数扩展
e.g.
#!/bin/bash
for image in *.gif; do
cjpeg $image > ${image%%gif}jpg
done
三、文件操作
5个基本函数:open.close.read.write.ioctl
ioctl:把控制信息传递给设备驱动程序。每个驱动程序都定义了自己的一组ioctl命令。

/proc文件系统
该目录中包含了许多特殊文件用来对驱动程序和内核信息进行更高层的访问。
./cpuinfo
./meminfo
./version
mmap函数:允许程序共享内存。
void *mmap(void *add, size_t len, int prot, int flags, int fildes,off_t off);
四、程序参数
int getopt(int argc, char *const argv[],const char *optstring)
返回值是argv数组中的下一个选项字符,循环调用getopt就可以依次得到每个选项。
五、终端
标准模式,非标准模式
判断文件描述符是否连接到一个终端 int isatty(int fd);
fileno用于将流转为文件描述符。
将与用户交互的部分与stdout ,stderr分离开,可以直接对终端读写 /dev/tty
termios结构
通过设置termios类型的数据结构中的值和使用一小组函数调用,可以对终端接口进行控制。
struct termios{
tcflag_t c_iflag;
tcflag_t c_oflag;
tcflag_t c_cflag;
tcflag_t c_lflag;
cc_t c_cc[NCCS];
};
初始化 int tcgetattr(int fd,struct termios *termios_p);
特殊控制字符TIME,MIN值,只能用于非标准模式,两者结合起来共同控制对输入的读取。还能控制在一个程序试图读取与一个终端关联的文件描述符时将发生的情况。
终端速度
要想设置新的终端速度,必须首先用函数tcgetattr获取当前终端设置,然后使用 设置终端速度的函数 ,最后使用函数tcsetattr写回termios结构。只有在调用了函数tcsetattr之后,终端速度才会改变。
通过termios结构,可以控制键盘的输入。
terminfo软件包使程序通过查询终端类型数据库来找到正确的终端信息。
当使用terminfo时,首先调用setupterm来设置终端类型,这将为当前的终端类型初始化一个TERMINAL结构。
六、
学习curses函数库。
许多全屏幕的应用程序都使用curses函数库,它易于使用,并且提供了终端无关的方式来编写全屏幕的基于字符的程序。
Linux使用的curses版本是ncurses(又称new curses)。libncurses5-dev or ncurses-devel.i386
至少存在一个curses窗口,称之为stdscr。
curses函数库用两个数据结构来映射终端屏幕,它们是stdscr(屏幕将会是什么样子),curscr(屏幕当前的样子)。
输出字符的过程:
1,使用curses函数刷新逻辑屏幕
2,要求curses用refresh函数来刷新物理屏幕。
所有的curses程序必须以initscr函数开始,以endwin函数结束。
1214

被折叠的 条评论
为什么被折叠?



