1.软件工具和开发资源的位置
应用程序或开发的工具:/usr/bin
头文件:/usr/include目录及其子目录
库文件:/lib或/usr/lib
系统配置文件:/etc
2.创建库文件
$ ar crv libfoo.a bill.o fred.o //用ar程序创建一个归档文件(静态库),把两个目标文件添加进去
$ ranlib libfoo.a //区分系统,有的系统不是必须的
使用上述新创建的库:gcc -o program program.o libfoo.a 或 gcc -o program program.o -L. -lfoo
3.nm命令
查看哪些函数被包含在目标文件、函数库或可执行文件里
4.ldd工具
查看一个程序需要的共享库
[root@localhost lib]# ldd libc.so.6
/lib/ld-linux.so.2 (0x00544000)
linux-gate.so.1 => (0x00b7f000)
5.家(home)目录
进入自己家目录:cd ~
进入别人家目录:cd ~user(~加用户名)
6.linux中比较重要的3个设备文件
/dev/console:系统控制台
/dev/tty: 控制终端的别名
/dev/null: 空(null)设备。所有写向这个设备的输出都丢弃,读这个设备会立即返回一个文件尾标识
7.访问设备驱动程序的底层函数(系统调用)
open:若调用成功,返回一个可以被read、write和其他系统调用使用的文件描述符。文件描述符是唯一的,且不能和其他运行中的进程共享。若两个程序同时打开同一个文件,则分别得到两个不同的文件描述符
read
write
close:终止文件描述符filedes与其对应文件之间的关联
ioctl:用于控制设备及其描述符行为和配置底层服务的接口
8.open系统调用
当使用带有O_CREATE标志的open调用来创建文件,必须用3个参数格式的open调用
int open(const char *path,int oflags,mode_t mode)
open("myfile",O_CREATE,S_IRUSR|S_IXOTH) 创建一个名为myfile的文件,文件属主拥有读权限,其他用户有执行权限
9.umask
是一个系统变量,作用是:当文件创建时,为文件的访问权限设定一个掩码。如果对应的位被设置为1,代表禁止对应的权限
如umask=032(000 011 010),表示:禁止组的写和执行权限,同时禁止其他用户的写权限
10.ioctl系统调用
int ioctl(int filedes,int cmd,...)
在Linux系统上,打开键盘上的LED灯:
ioctl(tty_fd,KDSETLED,LED_NUM|LED_CAP|LED_SCR)
11.time工具对程序运行时间测算
[root@localhost helloworld]# TIMEFORMAT="" time ./helloworld
Waiting for thread to finish...
thread_function is running. Argument was Hello World
Thread joined, it returned Thank you for your CPU time!
Message is now Bye!
0.00user 0.00system 0:03.00elapsed 0%CPU (0avgtext+0avgdata 2640maxresident)k
0inputs+0outputs (0major+203minor)pagefaults 0swaps
12.procfs
linux中一种特殊的文件系统,通常以/proc目录形式呈现
13.mmap函数
作用:建立一段可以被两个或更多个程序读写的内存。
配套的:mmap() msync() munmap()
14.文件锁定
linux提供了多种特性实现文件锁定,其中最简单的方法就是以原子操作的方式创建锁文件
创建锁文件,可以使用open系统调用,并带上O_CREATE和O_EXCL标志
O_EXCL标志作用:1)防止两个程序同时创建同一个文件 2)如果文件存在,open调用返回失败
1 #include <unistd.h> 2 #include <stdlib.h> 3 #include <stdio.h> 4 #include <fcntl.h> 5 #include <errno.h> 6 7 const char *lockfile = "/home/gqx0001100627/study/lock/LCK.test"; 8 9 int main() 10 { 11 int fd; 12 int tries = 10; 13 14 while(tries--){ 15 fd = open(lockfile,O_RDWR|O_CREAT|O_EXCL,0444); 16 if(-1 == fd){ 17 printf("%d - Lock already present\n",getpid()); 18 sleep(3); 19 } 20 else{ 21 printf("%d - I have exclusive access \n",getpid()); 22 sleep(1); 23 (void)close(fd); 24 (void)unlink(lockfile); 25 26 sleep(2); 27 } 28 } 29 30 exit(EXIT_SUCCESS); 31 }
15.区域锁定
锁定文件的区域,文件中的某个特定部分被锁定了,但其他程序可以访问这个文件中的其他部分。也叫文件段锁定或文件区域锁定。
linux有两种方法来实现这个功能:使用fcntl系统调用和使用lockf系统调用。fcntl比较常用。
#include <fcntl.h>
int fcntl(int fildes,int command,...)
command有三个可用于文件锁定的命令项:
F_GETLK
F_SETLK
F_SETLKW
当使用这些命令时,fcntl的第三个参数是指向flock结构的指针
int fcntl(int fildes,int command,struct flock* flock_structure)
16.文件中的每个字节在任一时刻只能拥有一种类型的锁:共享锁、独占锁或解锁
17.锁定状态下的读写操作
当对文件区域加锁之后,你必须使用底层的read和write调用来访问文件中的数据,而不要使用更高级的fread和fwrite调用,这是因为fread和fwrite会对读写的数据进行缓存,所以执行一次fread调用来读取文件中的头100个字节可能会读取超过100字节的数据,并将多余的数据在函数库中进行缓存。如果程序再次使用fread来读取下100个字节的数据,他实际上将读取已缓存在函数库中的数据。
18.常用调试技巧
/*定义一个全局变量 debug */
if(debug){
sprintf(msg,...);
write_debug(msg)
}
#if DEBUG
printf(" something ");
#endif
19.
__LINE__ 行号
__FILE__ 文件名
__DATE__ mm dd yyyy
__TIME__ hh mm ss
20. -g选项
-g 标志是对程序进行调试性编译试常用的一个选项
21.调试信息的加入将使可执行程序的长度成倍增加。尽管可执行程序的容量可能增加了(占用了更多的磁盘空间),但程序运行时所需要的内存数量还是和原来一样
可以使用strip <file> 将可执行文件中的调试信息删除而不需要重新编译程序
22. gdb
run
backtrace(简写bt) 或 where :栈跟踪
print :打印变量值
print array[0]@5 :打印出一组连续的数据项,本例就是 打印出array数组中5个数据元素
dispay array[0]@5 :每次程序停在断点位置时,自动显示数组的内容
list :列出程序源代码
break :设置断点
commands:作用是指定在程序到达断点位置时需要执行的调试器命令.
disable break 1:禁用断点
disable display 1
用调试器打补丁: set variable n=n+1
例:commands 2 2是断点号
>set variable n=n+1
>cont
>end
gdb可以用来调试已经崩溃的程序,程序运行失败时,linux系统通常会产生一个核心转储(core dump),并将它保存在core文件中。core文件是一个内存镜像文件,它包含运行失败的那个时刻的全局变量取值,可以通过gdb找出程序发生崩溃的位置。
at 1808 进程号
thread apply all bt 查看所有线程的堆栈内容
Thread num 查看某线程的堆栈内容
f num 进入函数调用栈的某一层
p 变量名 查看变量的值
b 设置断点(b 函数名/b 文件名:行号)
d b 删除断点
c 继续运行
p 打印
s(step) 单步跟踪(进入函数)
n(next) 单步跟踪(不进入函数)
finish 运行程序直到函数完成返回
u(until) 运行程序直到退出循环
bt 查看调用栈
thread 进入线程
f 进入函数调用栈某一层
info 显示相应信息,如info b就是显示断点信息,info local就是显示函数中局部变量的值
quit 退出
23.内存调试工具
electricfence,当发现内存被破坏时就停止程序运行
valgrind 可以检测出数组访问错误和内存泄露