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()函数
标签:文件,函数,dup2,编程,描述符,fd,Linux,oldfd,服务器 From: https://www.cnblogs.com/ustc2122zy/p/17664065.html