11Linux服务器编程之:VFS虚拟文件系统,dup()函数和dup2()函数



1dup函数和dup2函数

#include<unistd.h>

int dup(intoldfd);

int dup2(intoldfd, int newfd);

dup和dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。如果两个文件描述符指向同一个file结构体,File
Status Flag和读写位置只保存一份在file结构体中,并且file结构体的引用计数是2。如果两次open同一文件得到两个文件描述符,则每个描述符对应一个不同的file结构体,可以有不同的File
Status Flag和读写位置。请注意区分这两种情况。

#include <unistd.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main(void)

{

int fd, save_fd;

char msg[] ="This is a test\n";

fd =open("somefile", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);

if(fd<0) {

perror("open");

exit(1);

}

save_fd =dup(STDOUT_FILENO);

dup2(fd,STDOUT_FILENO);

close(fd);

write(STDOUT_FILENO,msg, strlen(msg));

dup2(save_fd,STDOUT_FILENO);

write(STDOUT_FILENO,msg, strlen(msg));

close(save_fd);

return 0;

}

2VFS虚拟文件系统

关于函数调用的实质

总结:

A:操作磁盘上的文件,都要经过驱动。

B:只要两个文件描述符指向的是同一个文件结构体,那么操作文件的时候就相当于在在文件后追加的过程,不会覆盖文件内容。如果同时用open打开两个文件,并且放回的两个文件描述符之间没有关联,那么这时候操作的时候一个写操作为覆盖另外一个写操作。

时间: 2024-10-18 11:09:27

11Linux服务器编程之:VFS虚拟文件系统,dup()函数和dup2()函数的相关文章

linux高性能服务器编程之poll

一.概述: 和select不同的是,poll使用一个pollfd来指向所要监听的fd,事件,返回事件.(pollfd下面详细讲.) 并且poll没有最大的文件描述符数量的限制,是自己定义一个pollfd数组来实现的. 它的缺点和select差不多,即 (1)每次调用poll,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大(2)当要确定一个文件描述符的状态时,都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大 二.poll介绍篇:  int poll(struct p

服务器编程之路:进无止境(下)

(接上文) 为了找到第二个命题的解决方法,我们可以再回过头来看看本文中第一版的服务器程序.前面也说了,第一版程序的问题在于,一条线程服务一个连接,而OS切换线程的开销很大,所以造成性能上不去.但第一版程序绝对是愉快的顺序编程.如果我们想保留顺序编程,那应该怎么克服性能方面的缺陷呢? 问题被直接导向为:既然OS调度线程很吃力,那是否存在一种"用户态线程",由程序自己调度,让OS一边玩儿去? 先抛出答案,所谓的"用户态线程",我们一般的实现就是"协程(coro

文件IO详解(十四)---dup函数和dup2函数详解

dup和dup2函数是在进程中用来复制文件描述符的,可以实现文件共享. ======================================================== 函数原型: 函数参数: oldfd:要被复制的文件描述符 newfd:在dup2函数中指定的新文件描述符 返回值: 调用成功返回新的文件描述符 调用失败返回 -1 ======================================================== 使用dup或者dup2函数实现文件共

服务器编程之路:进无止境(上)

首先不好意思,盗用了福特汽车的广告语,呵呵. 今天想在这里探讨一下高性能服务器(server)编程的一些通用技术(或者说是思想).编程技术发展至今,高性能服务器编程领域仍然是C语言的菜.而C语言在服务器编程中的技术,也不断在实践中提高,正暗含我们的题目. 有基础的初学者写的第一个基于TCP的服务器程序,想必大概是这样的: while (1) { listen();                      // TCP套接字监听 fd = accept();          // 接受远端连接

linux高性能服务器编程之epoll

一.概述: epoll是多路复用的一种,但它比select和poll更加高效.具体体现在以下几个方面: (1).select能打开的文件描述符是有一定限制的,默认情况下是2048,这对应那些大型服务器来说h是不足的.但 epoll则没有这个限制,它所支持的fd上限是最大可以打开文件的数目,这个数字一般远大于2048,举个例子,在1GB内存的机器上大约是10万左 右,具体数目可以cat  /proc/sys/fs/file-max察看,一般来说这个数目和系统内存关系很大. (2).因为文件描述符是

8Linux服务器编程之:chdir()函数和cd命令,getcwd()函数和pwd

 1chdir依赖的头文件 #include<unistd.h> 2函数定义 int chdir(const char *path); int fchdir(int fd); 函数说明: chdir的作用是改变工作目录 4getcwd依赖的头文件 #include<unistd.h> 5函数定义: char *getcwd(char *buf, size_t size); 函数说明,通过这个函数获得路径 6.案例说明: 7.pathconf依赖的头文件 #include<

10Linux服务器编程之:opendir()函数,readdir()函数,rewinddir()函数,telldir()函数和seekdir()函数,closedir()函数

 1 opendir所需的头文件 #include<sys/types.h> #include<dirent.h> 2函数声明 DIR *opendir(const char *name); DIR *fdopendir(int fd); 通过opendir来打开一个文件夹 3readdir依赖的头文件 #include<dirent.h> 4函数声明 struct dirent *readdir(DIR *dirp); int readdir_r(DIR *dir

9Linux服务器编程之:mkdir()函数和rmdir()函数

 1 mkdir依赖的头文件 #include<sys/stat.h> #include<sys/types.h> 2.函数声明: int mkdir(const char *pathname, mode_tmode); 3.案例说明: 运行结果: 注意:函数声明中的mode表示的是权限是多少 4rmdir:删除一个目录所依赖的头文件 #include<unistd.h> 5函数声明 int rmdir(const char *pathname); 6案例说明: 源

Linux服务器编程之:truncate()函数+案例说明

1.依赖头文件 #include<unistd.h> #include<sys/types.h> 2.函数定义: int truncate(const char *path,off_t length); int ftruncate(int fd,off_t length); 函数说明: The  truncate()  and ftruncate() functions cause the regular file named by path or referenced by fd