Linux文件共享(三)——dup

dup返回的新文件描述符是当前可用文件描述符中的最小值。它返回的新描述符与参数fd共享一个文件表项(file对象)。调用dup会使file的引用计数增1,即增加“打开文件”引用计数。图3-3是apue中的原图。

 

我们用以下程序测试并说明:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
int main(int argc, char *argv[])
{
    int fd1=0,fd2=0;
char buf1[]="hello";
char buf2[]="world";
fd1=open("./txt",O_RDWR|O_CREAT,FILE_MODE);
    printf("fd1:%d\n",fd1);
fd2=dup(fd1);
    printf("fd2:%d\n",fd2);

    if((write(fd1,buf1,strlen(buf1)))!=strlen(buf1))
printf("write fd1 error!!!\n");
close(fd1);

    if((write(fd2,buf2,strlen(buf2)))!=strlen(buf2))
printf("write fd2 error!!!\n");
return 0;
}

运行结果如图:

我们发现第一次调用close,文件并没有真正关闭,因为dup是file的引用计数为2,close(fd1),只是使引用计数变为1,而file对象并没有销毁。我们可以用图形表示调用dup后的情况。

总结:dup会增加“打开文件引用计数”(file对象的引用计数),造成两个描述符指向同一file对象。但不会创建新的file对象。

时间: 2024-11-03 19:01:23

Linux文件共享(三)——dup的相关文章

Linux文件共享(六)——描述符传递

注:转载请注明出处   作者:lvyilong316 5.1 进程间描述符传递 首先,我们先来讨论一个问题--进程间传递文件描述符究竟传递的是什么? 我们从传递描述符函数的参数来看是个fd,我们知道fd是打开文件指针的在数组中的下标,是一个整数,那么我们仅仅是把一个整数传递给另一个进程吗?答案肯定是否定的,因为仅仅是传递整数值,没有必要专门去实现一个api.至于深层次的的原因,我们可以想一下,假如接受进程仅仅收到的是一个整数值,他能知道什么,又能做什么呢?即使它知道这是来自另一个进程的一个打开文

新手学Linux(三)----使用 Vagrant 打造跨平台开发环境(二)

前言 安装步骤 工具以及环境介绍 第一步VirtualBox和vagrant的安装 第二步使用vagrant添加虚拟机镜像         1从互联网添加虚拟机镜像文件         2从本地添加镜像文件 第三步初始化虚拟机 第四步使用虚拟机 常用命令 前言     在上一篇<新手学Linux(二)--使用 Vagrant 打造跨平台开发环境(一)>文章中,给大家介绍了什么是vagrant?,vagrant能干什么,以及vagrant的主要使用者,那么今天就给大家讲讲vagrant的具体使用

linux编程-关于Linux的三个编程题,想了半天毫无头绪,感觉Linux编程好复杂。求大家帮助帮助我,谢谢。

问题描述 关于Linux的三个编程题,想了半天毫无头绪,感觉Linux编程好复杂.求大家帮助帮助我,谢谢. 1:子进程每隔一秒向文件写入信息,父进程每隔三秒读出子进程所写的信息并输出到屏幕. 2:模拟shell,设计一个交互式命令处理程序,注意对命令参数和环境参数的处理. 3:编写一个守护进程,实现功能为:每隔一秒,向当前目录下的hello文件里写入一行helloworld. 解决方案 Linux设备驱动编程之复杂设备驱动25岁了,是学linux运维还是编程好呢?求指点下 .. 解决方案二: 楼

从U盘运行Linux操作系统的三种方法

从U盘运行Linux操作系统的三种方法 usb_linux_0 你或许听说过在U盘上运行live Linux操作系统,但你知不知道可以永久的保存运行时的数据,或者直接将Linux安装到U盘?本文将介绍把Linux装进口袋(U盘)的三种方法,挑一种你最喜欢的方法吧! 将ISO映像烧录到U盘 usb_linux_1 把一个Linux发行版的Live ISO映像烧录到U盘中已 经变的极其容易了.从这里你可以在任意一台支持从U盘启动的PC上启动你的Linux系统.然而,这种方法有一个缺点:当你关机后,你

Linux文件共享(一)——进程与打开文件

Linux支持在不同进程间共享打开文件.为了说明文件共享,先来说明内核用于所有I/O的数据结构. 他们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响. 0.1和文件有关的对象 (1) inode(i节点): 保存一个文件的通用信息,每个inode有一个inode number,在文件系统中,一个inode number能够唯一地标识一个文件. (2) dentry(目录项对象):每个dentry代表路径中的一个特定部分.保存一个目录的链接信息.个人理解:描述一个文件和一个名字的

Linux的三种服务器的搭建方法

  1.tftp.干吗的?用于宿主机与目标机的通信.简而言之就是电脑与板子的通信 2.NFS.?干嘛的?全称 NET FILE DYSTEM 简单的来说就在一台linux主机上设置共享文件,然后让某些符合条件的linux及其可以享有这个共享文件或目录.拿windows共享文件想想就明白了. 3.Samba.?您又是干嘛的?上面的nfs是实现linux机器与linux机器共享,这个Smaba就是实现windows与linux机器的共享. 安装出现的问题 1.重启后用netstat -a |grep

Linux文件共享(四)——父进程与子进程之间的文件共享

注:转载请注明出处   作者:lvyilong316 由fork产生的进程为子进程.fork的一个特性是父进程所有的打开文件描述符(file_struct)都被复制到子进程中,父子进程的每个相同的打开描述符共享一个文件表项如图.   在linux系统中的具体实现可用下图表示(说明:进程的fs_struct也会被复制,图中没有画出). 这种共享的方式使父.子进程对同一个文件使用了同一个文件偏移量.如果父.子进程写到同一个文件描述符,但有没有任何形式的同步,那么它们的输出就会相互混合.在fork之后

linux实验三

实验3 Linux的进程控制 一.实验目的通过实验掌握Linux中进程控制的基本命令. 二.实验要求1.练习使用who, w, ps,pstree察看系统用户及进程的信息. 2.练习使用kill命令撤销进程. 3.练习进程前后台的切换. 三.         实验报告要求 1.              简要说明实验的目的.任务与设备 2.              写出具体的实验步骤及实验结果 3.              总结实验过程中遇到的问题及解决方法 4.             

Linux文件共享(五)——线程共享文件

注:转载请注明出处   作者:lvyilong316 4.1 Linux线程实现 在谈论线程之间共享文件之前,我想首先简单的介绍下linux线程的实现.最初的进程定义都包含程序.资源及其执行三部分,其中程序通常指代码,资源在操作系统层面上通常包括内存资源.IO资源.信号处理等部分,而程序的执行通常理解为执行上下文,包括对cpu的占用,后来发展为线程.在线程概念出现以前,为了减小进程切换的开销,操作系统设计者逐渐修正进程的概念,逐渐允许将进程所占有的资源从其主体剥离出来,允许某些进程共享一部分资源