一.linux服务器

1.1 什么叫守护进程

创建子进程,关闭父进程,这样让程序在后台运行的。

  1. bool daemonize()
  2. {
  3. pid_t pid = fork();
  4. if ( pid < 0 )
  5. {
  6. return false;
  7. }
  8. else if ( pid > 0 )
  9. {
  10. exit( 0 );
  11. }
  12. umask( 0 );
  13. //设置文件权限掩码,文件权限就是mode & 0777
  14. //创建新的会话,设置本进程为进程组的首领
  15. pid_t sid = setsid();
  16. if ( sid < 0 )
  17. {
  18. return false;
  19. }
  20. //切换工作目录
  21. if ( ( chdir( "/" ) ) < 0 )
  22. {
  23. /* Log the failure */
  24. return false;
  25. }
  26. //关闭输入设备 输出设备 和标准错误输出设备
  27. close( STDIN_FILENO );
  28. close( STDOUT_FILENO );
  29. close( STDERR_FILENO );
  30. //将标准输入 标准输出 标准错误输出都定向到/dev/null文件
  31. open( "/dev/null", O_RDONLY );
  32. open( "/dev/null", O_RDWR );
  33. open( "/dev/null", O_RDWR );
  34. return true;
  35. }

#include

Int daemon(int nochdir,int noclose)

第一个参数是改变工作目录(0默认为“/“),第二个参数为0的时候将 标准输入 标准输出 标准错误 都重定向到 /dev/null文件中去。

成功时返回0,失败返回-1并设置errno。

1.2 服务器模型

C/S模型 一个服务器,多个客户端进行通信,访问量过大的时候,所有客户的响应都会很慢。

P2P模型

资源共享,但是当用户传输的请求过多的时候,网络的负载将会被加重。每台主机既是客户端,本身又是服务端。

1.3 IO处理单元

IO处理单元主要是等待并接受新的客户连接,接受客户端数据,将服务器响应数据返回给客户端。

逻辑单元是一个进程或者线程。

网络存储单元可以是数据库、缓存以及文件

请求队列是各个单元之间通信方式的抽象。

1.4 IO阻塞

  1. **socket**默认为阻塞的,可以通过设计SOCK_NONBLOCK来使用fcntl调用F_SETFL命令设计其为非阻塞的套接字。
  2. 阻塞的文件描述符是阻塞**IO,非阻塞的文件描述符是非阻塞IO。**

针对阻塞IO执行的系统调用可能因为无法立即完成被操作系统直接挂起来,直到等待的事件发生了为止。(可能被阻塞的有accept send recv connect)

针对非阻塞的系统调用则立即返回,不管事件是否已经发生了。如果事件没有立即发生,则返回-1,必须根据errno来分类:

IO errno
AcceptSendrecv EAGAIN(再来一次)或者EWOULDBLOCK(期望阻塞)
connect EINPROGRESS(在处理中)

非阻塞IO需要其他IO机制一起使用:

1)I/O复用,应用程序通过IO复用函数向内核注册一组事件,内核通过I/O复用函数把其中就绪的事件通知给应用程序。常用的有select poll 以及 epoll_wait。但是I/O复用函数本身为阻塞的,能通过程序效率是因为具有同时监听多个I/O事件的能力。

2)SIGIO信号(信号驱动IO) 为一个文件描述符指定宿主进程,那么被指定的宿主进程将会捕获SIGIO信号,当文件描述符有事件发生时候,SIGIO的信号处理函数将被触发。

3)异步IO,用户可以直接对IO进行读写操作,告诉内核用户读写缓冲区的位置,以及IO操作完成后内核通知应用程序的方式,它总是立即返回,不论是否发生了阻塞。即内核进行I/O操作。

1.5 高效的事件处理模式

Reactor模式(同步I/O模型)

  1. **主线程只负责监听文件描述符是否有事件发生,有的话就通知工作线程**。主线程不做任何实质性工作。读写数据 接受新的连接 处理客户请求均在工作线程中去完成的。

Proactor模式(异步I/O模型,但是也可以用同步I/O来实现的)

所有IO操作交给主线程以及内核,工作线程主要负责业务逻辑。

怎么用同步I/O来模拟Proactor模式呢?

  1. **主线程执行数据读写操作,读写完成后,主线程向工作线程通知这一完成事件。工作线程得到数据结果,只用进行逻辑处理。**

1.6 高效的并发模式

多进程 多线程

并发模式值I/O处理单元和多个逻辑单元协调完成任务的方法,主要有两种类型,分别为

半同步/半异步

领导者/追随者

二.linux书籍

环境高级编程的 3 4 5 7 8 10 11 12
网络编程 1-8 11 14 16 26
linux服务器 游双+陈硕

三.linux常见指令

这是因为在写百度笔试题的时候,发现考了我不知道的指令,可以去牛客刷题嗷

3.1 不知道的指令

image.png
image.png

指令 功能
mkdir -p ./a/b/c 如果同时新建n层不存在的文件夹时候,必须加上一个-p。
touch ./1.txt 创建一个新的文件
cp -r ./tset 复制文件夹必须加上 -r,表示递归复制
rm -rf -f:force,强制删除,否则会每个文件都询问是否删除
-r:表示递归,移除文件夹的时候需要使用
>:覆盖输出,会覆盖掉原先的文件内容 >>:追加输出,不会覆盖原始文件内容,会在原始内容末尾继续添加
cat (1)#cat 文件的路径 输出终端
(2)#cat 待合并的文件路径1 待合并的文件路径2 …. 文件路径n > 合并之后的文件路径 合并文件
df -h
-h表示以可读性较高的形式展示大小,显示磁盘空间大小
head -n 文件路径 【n表示数字】 查看文件开头n行 默认10行
#tail -n 文件的路径 n同样表示数字 查看文件末尾b行 默认10行

less

| 查看文件,以较少的内容进行输出,按下辅助功能键(数字+回车、空格键+上下方向键)来查看更多 | |

wc

| -l:表示lines,行数
-w:表示words,单词数 依照空格来判断单词数量(不支持统计中文)
-c:表示bytes,字节数 | | 管道 | | (1)过滤(重要)#ls /root | grep y 列出root文件夹下所有名称含 ‘y’ 的文件/文件夹
grep指令:主要用于过滤
(2)统计某个目录下的文档的总个数 #ls /root | wc -l | |

whoami

| 当前登录的用户名 | |

ps -ef指令

| 作用:查看服务器的进程信息
-e:等价于“-A”,表示列出全部的进程
-f:显示全部的列(显示全字段) | |

du -sh

| 查看目录的真实大小
-s:summaries,只显示汇总的大小
-h:表示以高可读性的形式进行显示 | | find 路径范围 选项 选项的值 | 选项类型
-name:按照文档名称进行搜索(支持模糊搜索
-type:按照文档的类型进行搜索

文档类型:“-”表示文件(在使用find的时候需要用f来替换),“d”表示文件夹 | |

reboot

| 重新启动 | | shutdown | 语法1:#shutdown -h now “关机提示” 立刻关机
语法2:#shutdown -h 15:25 “关机提示” 定时关机
可以使用 #shutdown -c 取消关机 | | uname -a | 表示获取全部的系统信息(类型、全部主机名、内核版本、发布时间、开源计划),可以看到版本 | |

netstat -tnlp

| 查看网络连接状态
-t:表示只列出tcp协议的连接;
-n:表示将地址从字母组合转化成ip地址,将协议转化成端口号来显示;
-l:表示过滤出“state(状态)”列中其值为LISTEN(监听)的连接;
-p:表示显示发起连接的进程pid和进程名称; |

3.2 linux下查询IP链接

image.png
(1)uniq -c 根据相近的值计算和 , 因此之前需要排序好
(2) sort -n , 可以按照数字升序排 sort -nr 降序

3.3 linux压缩

打包和压缩
Windows的压缩文件的扩展名 .zip/.rar
linux中的打包文件:aa.tar
linux中的压缩文件:bb.gz
linux中打包并压缩的文件:.tar.gz
Linux中的打包文件一般是以.tar结尾的,压缩的命令一般是以.gz结尾的。而一般情况下打包和压缩是一起进行的,打包并压缩后的文件的后缀名一般.tar.gz。


命令:tar -zcvf 打包压缩后的文件名 要打包的文件
其中:z:调用gzip压缩命令进行压缩
c:打包文件
v:显示运行过程
f:指定文件名
示例:打包并压缩/usr/tmp 下的所有文件 压缩后的压缩包指定名称为xxx.tar
tar -zcvf ab.tar aa.txt bb.txt


命令:tar [-zxvf] 压缩文件
其中:x:代表解压
将/usr/tmp 下的ab.tar解压到根目录/usr下
tar -xvf ab.tar -C /usr———C代表指定解压的位置