Linux高性能服务器编程阅读1:
Linux:所有东西都是文件。socket也是可读,可写,可控制,可编程的文件描述符。
I/O高级函数:
1.pipe()和dup()/dup2()
pipe()函数创建的两个文件描述符fd[0]和fd[1]分别构成管道的两端,往fd[1]中写入的数据可以从fd[0]中读出。且,fd[1]只能写入数据,fd[0]只能读出数据,不能颠倒。
dup和dup2函数将标准输入重定向到一个文件,或者将标准输出重定向到一个网络连接。
dup,dup2都是属于创建文件描述符的函数,所以返回值也是一个文件描述符。
dup(oldfd)执行以后会返回一个新的并且是当前系统可用的最小整数值作为新的文件描述符,此时这个新的文件描述符将指向oldfd指向的同一个文件,共享所有的锁定、读写和各项权限和标志位。dup(oldfd,newfd)的意思就是,将文件描述符newfd指向oldfd(或者说oldfd被复制之后新的文件描述符被设定为newfd),dup2多出来的就是第二个参数可以指定新文件描述符的数值,因此dup2的返回值一定是不小于newfd的整数数值的。
2. sendfile函数和mmap函数,splice和tee函数
sendfile函数在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,这被称为零拷贝。
mmap函数和munmap函数:
mmap申请一段内存空间,我们可以将这段内存空间作为进程间通信的的共享内存,可以直接将文件映射到这段内存中。
munmap函数则释放这段内存空间。
splice在两个文件描述符之间传输数据,也是零拷贝操作。
tee在两个文件描述符之间复制数据,也是零拷贝操作。
3. fcntl函数:控制文件描述符
Linux服务器程序规范:
日志:rsyslogd既能接受用户进程输出的日志,又能接受内核日志。
用户进程输出:syslog函数
内核日志:rklogd
用户信息:
euid和uid:
euid:有效uid,文件所有者
uid:真实用户id,运行该文件的用户id
改变工作目录和根目录:getcwd()和chdir()
服务器程序后台化:daemon()函数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!