读书笔记之《Linux C编程一站式学习》

笔记放在其他地方想看不方便,就这里也放一份吧,后面的引用是看书时候的记录,可能比较没有逻辑。前面就写一些感受,备注吧。
首先这本书是培训机构的教材--!然后感觉果然是一站式,什么都有,对我来说应该正好,能复习一下,全面的了解下。除了算法和网络编程部分略过,其他都看完了。看得有些匆忙,打算接下来重点去研究之前不太知道的地方,罗列如下:

  1. 消息机制和信号
  2. 进程,线程和守护进程
  3. 网络编程--本书最后一个题就是实现一个简单的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

Paste_Image.png

循环:
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函数没有参数,没有返回值

2.png

shell 调试
-n 不执行检查错误
-v 标准错误输出
-x 每一行执行结果打印出来

正则表达式

grep -E 使用正则 -F不使用正则
正则用单引号

3.png
4.png
5.png
6.png

sed命令(按行处理)awk(可按行,可按列)
sed REG file

7.png

其他

信号:
kill -l 查看宏定义信号
alarm函数:一定时间后向该程序发信号

守护进程
线程
网络编程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容