笔记放在其他地方想看不方便,就这里也放一份吧,后面的引用是看书时候的记录,可能比较没有逻辑。前面就写一些感受,备注吧。
首先这本书是培训机构的教材--!然后感觉果然是一站式,什么都有,对我来说应该正好,能复习一下,全面的了解下。除了算法和网络编程部分略过,其他都看完了。看得有些匆忙,打算接下来重点去研究之前不太知道的地方,罗列如下:
- 消息机制和信号
- 进程,线程和守护进程
- 网络编程--本书最后一个题就是实现一个简单的web服务器
接下来是笔记
gcc 相关参数
gcc编译选项
-o 命名输出文件名
-Wall 输出所有的警告信息
-l 指定链接的库,如math.h的库文件名为/usr/lib/libm.so(/lib /usr/local/lib 三个文件夹下都可以)则应该-lm
-std=c99 使用c99标准 如for(int i=1;i<n;i++)此处需加c99标准
-E 可以看到预处理之后、编译之前的程序
-g 生成执行文件可进行gdb源码调试
-S 生成汇编代码
-O 优化[-O0 -O1 -O2 -O3 -Os]
-c 不链接
-I 指定头文件目录
-L 指定库文件目录
ar rs 打包.o文件为静态库 ar rs libdemo.a 2.o 3.o
gcc -print-search-dirs 输出gcc寻找的路径
-static 只使用静态库不用共享库,优先寻找共享库(.so);共享库:运行时链接
-fPIC 生成位置无关码
书中零碎点
echo $? 输出最近一次的return
man -k printf
1:用户命令 /bin /usr/bin
2:系统调用 /sbin /usr/sbin
3:库函数
i++ 和 ++i
两者都使i+1,但返回值不同,i++返回值为i,++i返回值为i+1
gdb参数
gdb a.out
list(l) 列出代码 list 1 从第一行开始列出代码 再list 紧接输出后续代码
list + 函数名
回车执行上次命令
退出quit
开始执行 start
下一条语句 next(n)
下一步 step(s) 跟进代码
查看状态 backtrace(bt)
选择栈帧 frame(f) + 栈帧号
info(i) locals 查看桢信息
调试时设置变量值 set var sum=0
print(p) 打印表达式值
finish 连续运行到当前函数
display + 变量 每次命令停下来都显示变量
undisplay + 变量编号 取消显示
break(b) + 行号 加断点
continue(c) 连续执行
delete breakpoints + 断点号
x/7b+变量 打印存储单元格内容
跟踪父子进程:
set follow-fork-mode child
set follow-fork-mode parent
makefile
main: main.o stack.o maze.o
gcc main.o stack.o maze.o -o main
main.o: main.c main.h stack.h maze.h
gcc -c main.c
stack.o: stack.c stack.h main.h
gcc -c stack.c
maze.o: maze.c maze.h main.h
gcc -c maze.c
clean:
@echo "cleanning project"
-rm main *.o
@echo "clean completed"
.PHONY: clean
一些函数
1.int open(const char *pathname, nt flags, ...);
打开文件
程序启动时,自动打开文件描述符 0,1,2
0:标准输入O_RDONLY
1 : 标准输出O_WRONLY
2:标准错误
2.umask 默认要去掉的权限
3.int close(int fd);
关闭文件
fd文件描述符
4.ssize_t read(int fd, void *buf, size_t count);
读取字节数,读写位置记录在内核中
读写常规文件不会阻塞,从终端或网络不一定;
返回可能小于请求的字节数
进程调用阻塞的系统函数时,该进程被置于睡眠状态(sleep),此时内核调度其他进程,直到该进程等待的事件发生。
/dev/tty表示当前终端
5.off_t lseek(int fd, off_t offset, int where)
同fseek(第一个参数不同,返回值不同)
设备不支持设置偏移量,返回-1;
6.fcntl
改变一个已经打开的文件的属性
O_ACCMODE<0003>:读写文件操作时,用于取出flag的低2位
O_RDONLY<00>:只读打开
O_WRONLY<01>:只写打开
O_RDWR<02>:读写打开
通过fcntl取出的flag与O_ACCMODE &下就是读写位
7.linux中的重定向:
command > file 标准输出重定向到文件 同 command 1> file
:> file 相当于touch file
command >> file 追加标准输出重定向到文件 同 command 1>> file
command 2> file 标准错误重定向到文件
command 2>> file 追加错误重定向到文件
M > file M为文件描述符 文件描述符重定向到文件
M > &N MN都是文件描述符 文件描述符重定向到文件描述符
M <> file 打开文件并将文件描述符分配给文件
8.ioctl
向设备发送命令
9.mmap
把磁盘文件映射到内存
10.ext2 文件系统
mkfs命令,创建文件系统
df命令显示所有文件系统对i节点和磁盘块的使用情况(只查看块位图)
du命令查看目录大小(遍历文件)
11.进程
fork--创建新进程
exec--执行新进程,替换当前进程,进程ID不变
只有execve是系统调用,其他exec都调用此函数
extern char **environ;声明环境变量
char *getenv(const char *name);查找环境变量
setenv
unsetenv
getpid获得进程ID
getppid获得父进程ID
命令行后加&表示进程在后台运行
僵尸进程指的是已经终止但未清楚PCB信息的进程(kill不能清除)
父进程清除子进程僵尸进程信息:wait/waitpid
进程通信
管道:int pipe(int filedes[2])
filedes 文件描述符,0-读,1-写
管道:
1.如果所有指向管道写端的文件描述符都关闭了(管道写端的引用计数等于0),而仍然有进程从管道的读端读数据,那么管道中剩余的数据都被读取后,再次read会返回0,就像读到文件末尾一样。
2.如果有指向管道写端的文件描述符没关闭(管道写端的引用计数大于0),而持有管道写端的进程也没有向管道中写数据,这时有进程从管道读端读数据,那么管道中剩余的数据都被读取后,再次read会阻塞,直到管道中有数据可读了才读取数据并返回。
3.如果所有指向管道读端的文件描述符都关闭了(管道读端的引用计数等于0),这时有进程向管道的写端write,那么该进程会收到信号SIGPIPE,通常会导致进程异常终止。在第 33 章
信号会讲到怎样使SIGPIPE信号不终止进程。
4.如果有指向管道读端的文件描述符没关闭(管道读端的引用计数大于0),而持有管道读端的进程也没有从管道中读数据,这时有进程向管道写端写数据,那么在管道被写满时再次write会阻塞,直到管道中有空位置了才写入数据并返回。
命令makefifo
shell脚本
创建以“-”开头的文件
touch ./-test
touch -- -test
linux 启动时执行脚本:
每个登录用户都执行 /etc/profile
当前用户主目录的 ~/.bash_profile ~/.bash_login ~/.profile
linux 用户退出时执行 ~/.bash_logout
交互非登录执行shell ~/.bashrc
shell
测试条件是否成立:成立的exit status 为 0 否则为 1
test 或者 []
test $var -gt 3
echo $?
[ $var -gt 3 ]
常见的测试命令:
[ -d DIR ] 测试目录是否存在
[ -f FILE ] 测试文件是否存在
[ -z STRING ] 测试字符串长度是否为0
[ -n STRING ] 测试字符串长度是否为非0
[ STRING1 = STRING2 ] 测试两个字符串是否相同
[ STRING != STRING2 ] 测试两个字符串是否不同
[ ARG1 OP ARF2 ] OP可以是 -eq -ne -gt -ge -lt -le , ARG1和ARG2应该是整数
逻辑
[ ! EXPR ] 非
[ EXPR1 -a EXPR2 ] 且
[ EXPR1 -o EXPR2 ] 或
常用命令
: 冒号是空命令,返回总是真
read 读入一行命令 read string
&& 相当于 if then
|| 相当于if not then
case
循环:
for FRUIT in apple banana pear; do
echo "I like $FRUIT";
done;
for FILENAME in chap? ;do
mv $FILENAME $FILENAME~;
done;
whiel [ $var -gt 3 ];do
var = $(($var - 1));
done;
特殊变量:
$? exit status
$0/1/2 参数
$@参数列表
$# 参数个数
$$ 当前shell进程号
shell函数没有参数,没有返回值
shell 调试
-n 不执行检查错误
-v 标准错误输出
-x 每一行执行结果打印出来
正则表达式
grep -E 使用正则 -F不使用正则
正则用单引号
sed命令(按行处理)awk(可按行,可按列)
sed REG file
其他
信号:
kill -l 查看宏定义信号
alarm函数:一定时间后向该程序发信号
守护进程
线程
网络编程