目录规划
nginx 根目录下的三个文件
makefile :编译项目的入口,编译项目从这里开始
config.mk:也是个配置脚本用来增加变动的东西,应付可变
common.mk:最核心的编译脚本,每个子目录都要被编译.cpp程序
配置文件
配置文件读取功能实战代码
该缩进的必须缩进,对齐的对齐;
1.读取文件的代码
2.内存泄露的检查
valgrind :工具集:
帮助程序员寻找bug,擅长内存管理的问题
memcheck 检测内存;
)memcheck的基本功能,能发现如下的问题;/a)使用未初始化的内存
//b)使用已经释放了的内存
//c)使用超过malloc()分配的内存
//d)对堆栈的非法访问
//e)申请的内存是否有释放*
//f)malloc/free,new/delete申请和释放内存的匹配
//g)memcpy()内存拷贝函数中源指针和目标指针重叠;
检查实例
valgrind --tool=memcheck
--leak-check=full:指的是完全full检测内存泄露
--show-reachable=yes;显示内存泄露的地点
--trace-children=yes :是否跟入子进程
--log-file=log.txt :将调试信息输出到log.txt 不输出到屏幕
设置可执行程序的标题
原理和实现的分析
argc :命令行参数的个数
argv:是个数组,每个数组元素都是指向一个字符串的char*,存的是命令行参数
内存连续;
argv 之后紧挨着后面的内存是环境变量内存保存的可执行程序所有环境变量的参数信息;
修改可执行程序的实现思路:
先把环境变量的内存搬走;
搬走了,命令行后面的参数你不用了,才可以增加长度
设置标题,然后,只要一个参数,然后跳过标题让其全部后面的为0;
日志打印 :
查看work mast进程
ps -eo pid,ppid,sid,tty,pgrp,comm,stat,cmd | grep -E 'bash|PID|nginx'
内核写入的write的命令是原语
父子进程共享文件描述符,那么就是子进程写完之后,父进程紧随其后写,因此同时写进一个日志的时候不会混乱;
没有亲缘关系的不共享,可能发生混乱;
write掉电解决:
直接iO ,直接访问物理磁盘O_DRECT 绕过内核,直接到磁盘,512的倍数分配空间
同步选项:
open文件是用 O_SYNC ,将写入的内核缓冲区的数据立即写入到磁盘
每次写数据,必须要大块大块的写数据,一般都4k 4k的写,节省系统调用的次数;
缓存同步:尽量保证缓存数据,和写道磁盘上的数据一致
sync(void)将所有修改过的块缓冲区排入写队列,然后返回,并不等待实际写磁盘操作,数据是否写入磁盘没有保证
fsync(int fd)将fd对应的文件的快缓冲区立即写入磁盘,并等待实际写磁盘操作返回,全部都影响,属性和数据;
fdatasync(int fd)只影响数据,不影响属性