日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

【转】Linux系统编程---dup和dup2详解

發(fā)布時間:2024/4/14 linux 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】Linux系统编程---dup和dup2详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

正常的文件描述符:

?

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

打開文件的內(nèi)核數(shù)據(jù)結(jié)構(gòu)

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

執(zhí)行dup后的內(nèi)核數(shù)據(jù)結(jié)構(gòu)

?

(1)dup函數(shù)

fd1=dup(fd);

fd1和fd共享一個文件表(對fd進行什么操作,fd1也會有相應(yīng)的操作,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進行了讀,如果輸出數(shù)據(jù)。說明fd和fd1是同步的(fd做了什么相當(dāng)于fd1也做了什么)

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

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

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

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

close(fd);

close(fd1);

return 0;

?

}

(2)dup2函數(shù)

?

fd2 = dup2(fd,fd1);

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

強調(diào)第幾個參數(shù)是因為如果你寫成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結(jié)果是從第6個字符開始的

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

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

close(fd);

close(fd2);

return 0;

}

dup和dup2的區(qū)別

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

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

轉(zhuǎn)載于:https://www.cnblogs.com/linuxAndMcu/p/7668138.html

總結(jié)

以上是生活随笔為你收集整理的【转】Linux系统编程---dup和dup2详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。