【轉】Linux系統編程---dup和dup2詳解

正常的文件描述符:

?

在linux下,通過open打開以文件后,會返回一個文件描述符,文件描述符會指向一個文件表,文件表中的節點指針會指向節點表。看下圖:

打開文件的內核數據結構

打開文件的內核數據結構

dup和dup2兩個函數都可以用來復制打開的文件描述符,復制成功后和復制源共享同一個文件表。看下圖:

執行dup后的內核數據結構

執行dup后的內核數據結構

?

(1)dup函數

fd1=dup(fd);

fd1和fd共享一個文件表(對fd進行什么操作,fd1也會有相應的操作,fd和fd1是同步的)。

具體解釋:

?

#inclue<stdio.h>

#include<sys/types.h>

#include<unistd.h>

#include<fcntl.h>

#include<stdlib.h>

int main()

{

char buf[6]={0};

char buf1[6]={0};

int fd = open("file",O_RDWR|O_CREAT,0644);

if(fd < 0)

printf("open error");

printf("fd:%d\n",fd);

//輸出fd=3;

write(fd,"hello,world",12);

lseek(fd,0,SEEK_SET); ?//將文件偏移量置為0,就是從第一個字符開始讀(h開始)

read(fd,buf,5);

printf("fd:%s",buf);//輸出hello

int?fd1 = dup(fd);

read(fd1,buf1,5); //之前做的是對fd的讀寫操作,并沒有對fd1做任何操作。但在這對fd1進行了讀,如果輸出數據。說明fd和fd1是同步的(fd做了什么相當于fd1也做了什么)

printf("fd1:%s\n",buf1); //輸出,worl

//既然輸出的是fd中的內容,說明fd和fd1共用一個文件表,讀到的是,worl,而不是hello(我們在上面將偏移量從第一個字符開始,輸出hello之后,fd的偏移量距離開始有5個字符當我們再次讀fd的時候,它是從第6個字符開始讀的,很明顯,第6個是逗號,往后讀5個,就是,worl),說明偏移量是一致的。(其實不用寫偏移量,因為共用文件表就意味著文件偏移量也共用)

printf("fd1:%d\n",fd1);//輸出fd1 = 4

//fd=3不等于fd1說明不共用同一個文件描述符。這也是dup和dup2的區別。

close(fd);

close(fd1);

return 0;

?

}

(2)dup2函數

?

fd2 = dup2(fd,fd1);

fd2用的fd1(第二個參數)的描述符,用的fd(第一個參數)的文件(和fd共享一個文件表,當然也共享文件偏移量)

強調第幾個參數是因為如果你寫成fd2=dup2(fd1,fd);那么fd2 =fd,和fd1共享同一個文件表。

?

#inclue<stdio.h>

#include<sys/types.h>

#include<unistd.h>

#include<fcntl.h>

#include<stdlib.h>

int main()

{

int fd = open("file",O_RDWR|O_CREAT,0644);

if(fd < 0)

printf("open error");

printf("fd:%d\n",fd);

//輸出fd=3;

int fd1 =open("text",,O_RDWR|O_CREAT,0644);

if(fd1 < 0)

printf("open error");

printf("fd1:%d\n",fd1);

//輸出fd1=4;

int fd2 = dup2(fd,fd1);

printf("fd2:%d\n",fd2);

//輸出fd2=4;

//fd1 =fd2=4;說明fd2使用了fd1的文件描述符。

?

char buf[12]="hello,world";

write(fd,buf,12); //我們對fd進行了寫,并沒有對fd2進行寫

read(fd2,buf,12);//但是我們對fd2讀的時候,如果沒有寫,怎么可能讀出來呢

printf("fd2:%s\n",buf);//事實是讀出來了

//輸出fd2:hello,world ? ?//說明fd和fd2共用一個文件表。

?

lseek(fd,5,SEEK_SET);//距離開始偏移5位,說明下次讀的時候是從第6個開始,注意我們是對fd進行偏移,沒有對fd2偏移

read(fd2,buf,5); ?//但是如果讀fd2結果是從第6個字符開始的

buf[5]=0; //如果不寫這句,輸出的buf是按照12個字符輸出的。因為定義buf的時候數組中可以放12個字符。

printf("fd2:%s\n",buf);//輸出fd2:,worl ?//說明fd2和fd共享文件偏移量。

close(fd);

close(fd2);

return 0;

}

dup和dup2的區別

dup:fd1= dup(fd);目標描述符使用了fd的文件表

dup2:fd2 = dup2(fd1,fd)目標描述符使用了fd1的描述符,使用了fd的文件表

轉載于:https://www.cnblogs.com/linuxAndMcu/p/7668138.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251703.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251703.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251703.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android Activity標簽屬性

Android Activity標簽屬性 Activity 是 Android 系統四大應用組件之一&#xff0c;用戶可與 Activity 提供的屏幕進行交互&#xff0c;以執行撥打電話、拍攝照片、發送電子郵件等操作開發者必須在清單文件中聲明要使用的 Activity&#xff0c;這樣系統才能訪問它。聲明方式是在…

Java -----JVM運行時數據區

一、JVM體系結構 想要了解運行時數據區&#xff0c;先關注一下JVM的體系結構&#xff0c;知道數據區在JVM的整體位置和作用。 二、JVM運行時數據區 1.程序計數器 一塊較小的內存空間&#xff0c;它是當前線程所執行的字節碼的行號指示器&#xff0c;字節碼解釋器工作時通過改變…

20155235 《網絡攻防》 實驗八 Web基礎

20155235 《網絡攻防》 實驗八 Web基礎 實驗內容 Web前端HTML(0.5分) 能正常安裝、啟停Apache。理解HTML&#xff0c;理解表單&#xff0c;理解GET與POST方法,編寫一個含有表單的HTML。Web前端javascipt(0.5分) 理解JavaScript的基本功能&#xff0c;理解DOM。編寫JavaScript驗…

python每天1道面試題(3)--字符串組合

""" 題目3&#xff1a;輸入一個字符串&#xff0c;輸出該字符串中字符的所有組合。舉個例子&#xff0c;如果輸入abc&#xff0c;它的組合有a、b、c、ab、ac、bc、abc。解題思路: 先用列舉法,舉例出組合元素長度分別是1,2,..,len(str)時的具體元素, 然后發現當數…

【每周一圖】蜂鳥

攝影/祈澈姑娘小花園偶遇的一只蜂鳥轉載于:https://www.cnblogs.com/wangting888/p/9702088.html

API網關如何實現對服務下線實時感知

上篇文章《Eureka 緩存機制》介紹了Eureka的緩存機制&#xff0c;相信大家對Eureka 有了進一步的了解&#xff0c;本文將詳細介紹API網關如何實現服務下線的實時感知。 一、前言 在基于云的微服務應用中&#xff0c;服務實例的網絡位置都是動態分配的。而且由于自動伸縮、故障和…

TCP為什么要三次握手和四次揮手

http://www.jellythink.com/archives/705 簡析TCP的三次握手與四次分手 https://zhuanlan.zhihu.com/p/24001696 計算機網絡面試題 https://www.zhihu.com/question/36930631 TCP四次分手中&#xff0c;主動關閉方最后為什么要等待2MSL之后才關閉連接&#xff1f; http://ww…

Java處理文件BOM頭的方式推薦

背景&#xff1a; java普通的文件讀取方式對于bom是無法正常識別的。 使用普通的InputStreamReader&#xff0c;如果采用的編碼正確&#xff0c;那么可以獲得正確的字符&#xff0c;但bom仍然附帶在結果中&#xff0c;很容易導致數據處理出錯。另外&#xff0c;對于存在BOM頭的…

封裝svg組件

如何封裝svg圖標組件 封裝svg圖標組件的方法有很多種&#xff0c;如果只是單純的想使用svg圖標&#xff0c;可以將svg導出fonts字體圖標使用&#xff0c;但這樣做會失去svg原有的樣式與尺寸&#xff0c;也可以當成img圖片或者背景引入&#xff0c;但這樣做非常繁瑣。 最近項目中…

RabbitMQ 延遲隊列,消息延遲推送

應用場景 目前常見的應用軟件都有消息的延遲推送的影子&#xff0c;應用也極為廣泛&#xff0c;例如&#xff1a; 淘寶七天自動確認收貨。在我們簽收商品后&#xff0c;物流系統會在七天后延時發送一個消息給支付系統&#xff0c;通知支付系統將款打給商家&#xff0c;這個過程…

windows Navicat Premium連接oracle

需要下載并指定Instant Client 下載地址&#xff1a;在oracle官網搜索Instant Client Downloads選擇自己需要的客戶端 //說明 //Navicat 版本 9 或以上捆綁了 instant client&#xff0c;但是捆綁的用不了&#xff0c;捆綁的10.2。因此下載高版本替換之 //版本有要求&#xff0…

關于arraylist的擴容機制

ArrayList會自動改變size的長度&#xff1a; 首先&#xff0c;ArrayList定義了一個私有的未被序列化的數組elementData&#xff0c;用來存儲ArrayList的對象列表&#xff08;注意只定義未初始&#xff09;&#xff1a;private transient Object[] elementData;   其次&am…

不同級別UI設計師的區別有哪些?

不同等級的UI設計師在工作內容以及基本的薪資待遇方面也是有區別的&#xff0c;很多在UI培訓學校學習的小伙伴們并不知道各個等級的UI設計師工作內容有什么差別&#xff0c;那么合肥學碼思小編就給大家總結一下這些區別分別表現在哪些方面。 一、初級UI設計師 初級UI設計師的主…

Linux命令行參數前加--,-和不加杠

參數前“-”的表明后面的參數是字符形式。參數前“--”的則表明后面的參數是單詞形式。參數前有橫的是System V風格。 參數前沒有橫的是BSD風格。 轉載于:https://www.cnblogs.com/YYRise/p/9090476.html

反射筆記-----------------------------

1.反射基本概念&#xff1a; 01.定義&#xff1a; 反射是指在程序運行期間&#xff0c;能夠觀察和修改類或者類的對象的屬性和行為的特性&#xff01; 02.作用&#xff1a; 001.在運行期間獲取類的修飾符&#xff0c;包名&#xff0c;類名&#xff0c;實現的接口&#xff0c;繼…

kubernetes 集群部署

kubernetes 集群部署 環境JiaoJiao_Centos7-1(152.112) 192.168.152.112JiaoJiao_Centos7-2(152.113) 192.168.152.113JiaoJiao_Centos7-3(152.114) 192.168.152.114已開通 4C8G80G 集群規劃 部署方式 環境準備&#xff1a;基于主機名稱通信&#xff0c;時間同步&#xff0c;關…

PHP學習筆記--抽象類和抽象方法的應用

抽象類** 什么是抽象方法&#xff1f;** 定義&#xff1a;如果一個類中的方法&#xff0c;沒有方法體的方法就是抽象方法(就是一個方法沒有使用{}而直接使用分號結束)* * abstract function test(); //抽象方法* * function test(){ //有方法體…

wordpress 顯示數學公式 (MathJax-LaTeX)

blog 不放一堆數學公式怎么能顯得高大上&#xff0c;所以 MathJax-LaTeX 也是必裝的插件之一了。 一、安裝 MathJax-LaTex 插件 直接在 wordpress 插件中&#xff0c;搜索并安裝 MathJax-LaTeX 二、安裝本地 MathJax 服務 不過由默認的 MathJax cdn 服務經常被墻&#xff0c;所…

長春理工大學第十四屆程序設計競賽(重現賽)F.Successione di Fixoracci

鏈接&#xff1a;https://ac.nowcoder.com/acm/contest/912/F 題意&#xff1a; 動態規劃(Dynamic programming&#xff0c;簡稱dp)是一種通過把原問題分解為相對簡單的子問題的方式求解復雜問題的方法。例如&#xff0c;假設小x一步能爬1層或2層臺階&#xff0c;求小x爬n層臺階…

ConstraintLayout

ConstraintLayout使用筆記 具體使用參考&#xff1a;http://blog.csdn.net/guolin_blog/article/details/53122387 ConstraintLayout 好處還是很明顯&#xff0c;確實可以減少嵌套。性能對比參閱&#xff1a;http://www.cnblogs.com/liujingg/p/7161319.html 簡單嵌套Constrain…