1、gcc
gcc -I(include目录) gcc -o(输出文件) gcc -c(产生.o文件) gcc -L . -lfoo(使用当前目录libfoo.a) gcc -g(添加调试信息)
.a静态库 .so动态库
合并静态库: ar crv libfoo.a bill.o fred.o
生成内容表:ranlib libfoo.a
nm命令列出.o文件的各种符号
Linux负责动态库加载的模块是ld.so(动态装载器),配置文件/etc/ld.so.conf,加载命令ldconfig
查看程序所需共享库命令ldd
2、shell
Shell内置变量:
$# 参数个数
$$ 脚本进程号
$* IFS分割的所有参数
$@ 所有参数
Shell if:
test等同[]:
if test -f fread.c then if [ -f fread.c ]; then
... ...
fi fi
参数:
-d文件为目录 -e文件存在 -f为文件 -g -r可读 -w可写 -x可执行
-n字符串不为空 -z字符串为空
-eq== -ge>= -gt> -le<= -lt<
循环:
for foo in bar while ; until ;
do do do
... ... ...
done done done
break continue
return 整数返回值
选择:
case “$a” in
yes | y ) echo “yes!!!” ;;
no | n ) echo “no!!!” ;;
*) echo “*!!!” ;;
esac
内置函数:
eval
exec执行命令
export设置子shell环境变量
expr数学计算,等同于$(( $a + 1))
set设置变量
shift减少参数,从1开始左移
unset删除变量
find
-depth查看目录本身之前先搜索目录
-follow跟随符号链接
-maxdepth N最大搜索深度
-mount(-xdev)不搜索其他系统中的目录
-atime N N天之前访问过
-mtime N N天之前修改过
-name pattern 名字
-newer otherfile 比otherfile新
-type C 文件类型d目录 f文件 c特殊
-user username用户
! 取反
-a 与
-o 或
-exec command 执行命令,以\:结尾
-print 打印
-ls
find . -newer while2 -type f -exec ls -l {} \;
grep
-c 匹配行数
-E 正则表达式
-h 取消输出前缀
-i 忽略大小写
-l 列出匹配文件名
-v 取反模式
^ 开头
$ 结尾
. 任意字符
[] 区间
[^] 反区间
[:alnum:] 数字字符串成
[:alpha:] 字母
[:ascii:] ASCII字符
[:blank:] 空格或者制表符
[:cntrl:] 控制字符
[:digit:] 数字
[:graph:] 非控制字符
[:lower:] 小写字母
[:print:] 可打印字符
[:punct:] 标点
[:space:] 空白
[:upper:] 大写字母
[:xdigit:] 十六进制数字
字符串:
${param:-default} param空则default
${#param} param长度
${param%word} 从头部开始删除word(最短)返回剩余
${param%%word} 从头部开始删除word(最长)返回剩余
${param#word} 从尾部开始删除word(最短)返回剩余
${param##word} 从尾部开始删除word(最长)返回剩余
3、linux文件函数
open read write close flush ioctl lseek fstat stat lstat
fopen fread fwrite fclose fflush fseek(fgetpos,fsetpos,ftell) fgetc(getc,getchar)
fputc(putc,putchar) fgets(gets) printf(fprintf,sprintf) scanf(fscanf,sscanf) remove
chmod chown unlink(link,symlink) mkdir(rmdir,chdir,getcwd) opendir(readdir,telldir)
seekdir closedir
/proc目录,实现对内核和驱动程序的访问
/proc/cpuinfo /proc/meminfo /proc/version /proc/pid
mmap内存映射,建立一段可以被两个或多个程序读写的内存
分析argv参数的函数
getopt getopt_long
getenv putenv
time difftime mktime localtime gmtime
asctime ctime strftime strptime
临时文件:
tmpnam tmpfile
日志:
syslog closelog openlog setlogmask
进程:
优先级-20~20默认0,数值越高优先级越低
getrusage getpriorty setpriorty getrlimit setrlimit(栈大小、cpu时间、数据大小、文件大小、文件数、dump大小、地址空间)
4、终端
Linux使用换行符代表一行结束,windows回车+换行符,目的是字节流的统一
检查标准输出重定向:isatty
isatty(fileno(stdout)) ::fileno获取底层文件流使用的文件描述符
终端设备,当前登陆会话在/dev/tty,命令stty
查看当前终端类型 echo $TERM
5、内存分配
malloc(calloc数组内存分配,realloc改变已分配内存长度) free
内存页面大小4k
检测内存泄露:
cc -o efence efence.c -lefence 使用efence库
valgrind --leak-check=yes -v ./checker
6、文件锁定
fcntl.h
全文件锁与区域文件锁
file_desc = open(“/tmp/lck.test”, O_RDWR|O_CREAT|O_EXCL, 0444)
fcnt(int fildes, int command, struct flock*)
7、dbm数据库
dbm_opem dbm_store dbm_fetch dbm_close dbm_delete dbm_firstkey dbm_nextkey
8、Mysql数据库
mysql -u root
select user,host,password from mysql.user;
grant all on *.* to rick@localhost identified by isecretpassword;
myisamchk
mysqladmin
msqlbug
mysqldump
mysqlimport
mysqlshow
grant revoke
9、Make、makefile、cmake
makefile规则:
依赖关系: 目标名称:文件a 文件b
规则:以table开头
注:一次性多个文件使用伪目标all,all:myapp myapp.1
一个实例:
all:myapp #which compiler CC = gcc #where are include files kept INCLUDE=. #options for develop CFLAGS=-g -wall -ansi #option for release CFLAGS=-o -wall -ansi myapp:main.o 2.o 3.o $(CC) -o myapp main.o 2.o 3.o main.o:main.c a.h $(CC) -I$(INCLUDE) $(CFLAGS) -c main.c 2.o:2.c a.h b.h $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c 3.o:3.c b.h c.h $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c clean: -rm main.o 2.o 3.o install: @if [ -d $(INSTALL) ];\ then \ cp myapp $(INSTALL); \ ...... else \ echo ......; \ fi
10、Gdb调试
编译加入-g选项,加入-p(pg)选项产生执行存储
gdb xxxexe; gdb xxxx xxx.dum
run 执行
bt 堆栈
p i 打印i变量
list 代码
b 21 在21行断点
c 继续执行
display array[0]@5 显示array变量
info break 断点列表
info display 监视列表
disable break/display 设置断点或者监视无效
command 2 编辑断点2
代码审查工具:lint splint
函数调用工具:ctags创建函数索引 cxref变量调用列表 cflow函数调用树
11、进程
ps -ef ps-ax
进程状态:S睡眠 R运行 D等待 T停止 Z僵死
system启动新进程 exec替换当前进程 fork复制进程 wait等待子进程结束
信号
void (*signal(int sig, void (*func)(int)))(int);
发送信号:kill alarm pause sigaction
信号集:sigaddset sigemptyset sigfillset sigdelset sigismember sigprocmask sigpending sigsuspend
pthread_create pthread_join pthread_exit pthread_cancel pthread_setcancelstate
信号量:sem
sem_init sem_wait sem_post sem_des
互斥量:mutex
pthread_mutex_init pthread_mutex_lock pthread_mutex_unlock pthread_mutex_destroy
12、管道
popen pclose
pipe dup
命名管道:mkfifo filename,open/close/read/write
13、IPC
信号量:semget semop semctl
共享内存:shmget shmat shmctl shmdt
消息队列:msgget msgctl msgrcv msgsnd
信号量、共享内存、消息队列存在残留问题,使用ipcs/ipcrm命令查看:
信号量 ipcs -s ipcrm sem
共享内存 ipcs -m ipcrm shm
消息队列 ipcs -q ipcrm msg
14、网络字节序与主机字节序
htonl: host to net long
htons: host to net short
ntohl: net to host long
ntohs: net to host short