Linxu程序设计读书笔记

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

 

2shell

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、Makemakefilecmake
makefile规则:
依赖关系: 目标名称:文件a 文件b
规则:以table开头
注:一次性多个文件使用伪目标allall: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





特殊标记符:
$?  当前目标依赖的文件列表中比目标新的文件
$@  当前目标的名字
$<  当前依赖文件名字
$*  不包括后缀名的依赖文件名字
子目录:
A)mylib.a:
(cd mylibdir; $(MAKE))
B).c.o:
$(CC) $(CFLAGS) -c $(@D)/$(<F) -o $(@D)/$(@F)
  mylib.a:mydir/2.o mydir/3.o
ar -rv mylib.a $?
Cmake
cmake_minimum_required(VERSION 2.6)
project (XXXX)
SET(CMAKE_CXX_FLAGS_DEBUG “-g -ggdb -Wall -Wno-deprecated”)
include_directories
link_directories
add_subdirectory
add_execuutable
target_link_libraries
子目录
add_library(xxx
x.cpp
y.cpp
)

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 filenameopen/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


你可能感兴趣的:(Linxu程序设计读书笔记)