1.每一个硬盘的第一个扇区为:“启动扇区”,它包括了这个硬盘的分区表,还可能包括了启动系统的代码。
2.第一个硬盘的“启动扇区”被称为:“主引导记录(MBR)”,是因为当你启动系统时,BIOS把控制权交给了它上面的的一段程序(启动装载器)。
3.LILO
它包括:启动装载器和lilo命令。
lilo命令主要用于配置,安装,和更新启动装载器。
一旦你改变了/etc/lilo.conf或者重新编译或删除一个内核映象时,你就需要从新运行lilo,从而重新建立映象文件和更新LILO。
4.GRUB的安装
A.使用grub-install命令
grub-install /dev/hda
5.rpm包的命名规则
package-version-release.architecture.rpm
6.rpm包格式软件的选项说明
rpm -U:安装一个新的软件并且删除旧版本
rpm -i:直接安装软件
rpm -q:查询一个包的安装情况,它还包括两个子集合选项
rpm -q -X. (x=a:查询所有的包;)
rpm -e:删除一个包
7.通用的系统程序一般放置在:/usr/bin;系统管理员安装的特殊软件一般在:/usr/local/bin or /opt
而X WINDOW的程序一般装在:/usr/X11
8.程序要使用的头文件一般放在:/usr/include及其子目录下(/usr/include/sys;/usr/include/linux)
9.在编译程序的时候,我们也可以指定编译器从特定的地方寻找头文件例如:
gcc -I /usr/openwin/include fred.c
就指明了GCC从"/usr/openwin/include"和"标准地方"寻找头文件
10.一般可以使用 grep 命令来查找特定的宏命令 例如:
grep EXIT_*.h
就会返回定义了 EXIT_*.h的文件名
11.库文件
它是一组已经被编译过的函数集合(一般是完成一些公共的,基本的操作,例如:数据库访问进程,屏幕处理函数等),以便以后调用。标准库函数存放的目录是:/lib和/usr/lib
库文件的命名有如下规则:
A.以lib开头
B.以.a(静态库)或者.so结尾(共享库)
在便宜程序的时候,我们可以用以下方式指定在哪里查找使用的库:
gcc -o fred fred.c /usr/lib/libm.a
也可以使用 -l 标志来代表:lib这个字符串
gcc -o fred fred.c -lm和上面的等效
同时我们也可以指定特定的库目录 如:
gcc -o x11fred -L/usr/openwein/lib x11fred.c -lX11
12.编写自己的库文件
1.在 /home/ljw/src/test/lib 下编写如下两个文件:bill.c和fred.c
2.bill.c如下:
#include <stdio.h>
void bill(char* arg)
{
printf("bill: you passed %s/n",arg);
}
3.fred.c
#include <stdio.h>
void fred(int arg)
{
printf("fred:you passed %d/n",arg);
}
4.使用 gcc -c bill.c fred.c把这两个文件编译成目标文件,而不进行连接.
5.在/home/ljw/src/test/include
下编写一个头文件lib.h来包含这两个函数的申明
lib.h
#ifndef _LIB_H_
#define _LIB_H_
void bill(char*);
void fred(int);
#endif
6.在 /home/ljw/src/test 下编写一个主程序文件 program.c
program.c
#include "lib.c"
int main()
{
bill("Hello world !");
exit(0);
}
7.把program.c编译成目标文件
gcc -I /home/ljw/src/test/include/ -c program.c
其中-I 用来指定头文件的寻找目录
8.再把刚才的几个文件编译成可执行文件
gcc -o program program.o lib/bill.o
9.运行
./program
10.到此为止我们就完成了传统的编译和连接的过程,接下来我们来形成库文件
使用ar命令把目标文件集合在一起(在/home/ljw/src/test/lib下执行)
ar crv libfoo.a bill.o fred.o
a - bill.o
a - fred.o
11.使用ranlib libfoo.a形骋桓隹獾列表文件
12.使用
gcc -o program program.o lib/libfoo.a (1)
gcc -o program program.o -Llib/ -lfoo (2)
gcc -I include/ -o program program.c -Llib -lfoo (3)
都可以生成可执行文件
注意: gcc -I include/ -Llib -lfoo -o program program.c
不能形成可执行文件!原因还不清楚!
13.使用 nm命令可以查询出一个目标文件或可执行文件里包含了哪些函数
14.可以使用ldd命令查看一个可执行文件包含哪些动态库
15.输出重定向
ls -l > lsoutput.txt 将覆盖lsoutput.txt的内容
ps >> lsoutput.txt 将追加lsoutput.txt
16.输入重定向
more < killout.txt
17.管道:用于连接两个进程 |
ps | sort >pssort.out
18.find 命令格式
find [path] [options] [tests] [actions]
option:
-depth:先从子目录找起走
-follow:跟踪符号连接
-maxdepths N :最多查找深度
-mount(or xdev):不查找挂起的目录
tests:
-name pattern:按名称匹配
-user username:匹配拥有者
-type :文件匹配类型,一般的有 d:表示目录,f:表示常规的文件
例如:
find . -newer while2 -print
在当前目录中找出比while2更新的文件
再如:find . -newer while2 -type f -print
在当前目录中查找比 while2新的文件,当测试通过时;再测试类型是一般
文件的对象,当测试通过时 把文件打印出来
19.grep 文件
grep=general regular expression parser
我们一般用它来查找字符匹配的对象
grep [options] PATTERN [FILES]
options:
-c:打印出匹配的行数,而不是行
-E:优化扩展表达式
-h:把文件名加到匹配行的前面
-i:不考虑大小写
-l:列出文件名
-v:选择不匹配的行,而不是匹配的行
例如:
grep in words.txt
i am in school.
grep -c in words.txt words2.txt
words.txt:2
words2.txt:14
grep -c -v in words.txt words2.txt
words.txt:9
words2.txt:16
20.库函数级别的文件操作
1.FILE *fopen(const char *filename,const char*mode)
它相当于open这个系统调用.
2.size_t fread(void *ptr,size_t size,size_t nitems,FILE *stream) fread用于读取块数据,返回读取的记录块数,放在ptr指示的内存区
3.size_t fwrite(const void *ptr,size_t size,size_t nitems,FILE
*stream)
4.fclose(FILE *stream)
5.int num;scanf("Hello %d",&num)
这输入字符串要满足前5个是
"Hello",并且后一个是数字,中间的一个空格用来ignore所有的空格和tab,/n等
21.向程序传参数
int main(int argc,char *argv[])
如果执行 myprog left right 'and center' 那么
argc:4
argv:{"myprog","left","right","and center"}
命令本身作为第一个参数,要进一步处理是选项还是参数,可以参考getopt函数,做进一步处理
22.make的使用
make命令本身有下面几个option
-k:跳过错误继续
-n:打印出本应该做的,但没有完成的
-f <filename>:指定要使用的makefile文件
dependency:
一个target通常需要dependency语法是:
target名称+":"+" "+dependency文件名1+""+dependency文件名2+.
例如:
myapp: main.o 2.o 3.o
main.o: main.c a.h
2.o: 2.c a.h b.h
3.o: 3.c b.h c.h
表示myapp这个target需要 main.o,2.o,3.o
如果我们要make多个文件,我们使用 all这个target
all: myapp
如果没有all这个target,那么make就只创建第一个target
rules:
它说明按什么样的规则make target,比如我们要指定头文件的位置,库
文件的位置等.每一个rule必须是一个tab开头!!
下面是一个简单的makefile文件的内容:
myapp: main.o 2.o 3.o
gcc -o myapp main.o 2.o 3.o
main.o: main.c a.h
gcc -c main.c
2.o: 2.c a.h b.h
gcc -c 2.c
3.o: 3.c b.h c.h
gcc -c 3.c
makefile文件里变量的使用:
变量一般被定义成大写:变量的应用使用 $(变量名),
$@,$<,$^为内置变量
$@:代表一个target的名称
$<:代表一个target的第一个dependency对象
$^:代表一个target的所有dependency对象
例如:
---makefile----
OBJS= foo.o bar.o
CC= gcc
CFLAGS= -Wall -O -g
myprog: $(OBJS) ------> myprog: foo.o bar.o
$(CC) $^ -o $@ ---> gcc foo.o bar.o -o myprog
foo.o: foo.c foo.h bar.h
$(CC) $(CFLAGS) -c $< -o $@ ---->gcc -Wall -O -g -c
foo.c -o foo.o
bar.o: bar.c bar.h
$(CC) $(CFLAGS) -c $< -o $@ -->gcc -Wall -O -g -c
bar.c -o bar.o
--------endmakefile-----
23.gdb的使用
file :转入想debug的程序
kill:结束在debug的程序
list:列出原文件的代码
next:执行一行代码但不进入函数
step:进入函数内部
run:执行当前程序
quit:退出程序
watch:观察一个变量
print:打印出变量的value
break:设置断点
make:不退出gdb就重新产生可执行文件
shell:使你不离开gdb就执行shell命?
delete:删除所有的断点
其中经常用到的就是 next,step,break,run,watch,print,delete
使用watch时,不关什么时候变量名被改变,gdb都会打印出以下格式:
old value:
new value: