1. 程式人生 > >檔案描述符複製函式dup2()詳解

檔案描述符複製函式dup2()詳解

dup2()是dup()的“升級版“,原型是int dup2(int oldfd, int newfd),作用是讓檔案描述符newfd與oldfd所關聯的檔案(或緩衝區或管道或共享記憶體等)關聯起來,如果一開始newfd已經和某個檔案關聯了(一個描述符同一時刻只能關聯一個檔案),那它會先解除newfd和某個檔案的關聯,然後再關聯oldfd關聯的那個檔案。下面就拿檔案描述符0,1做引數來寫兩個例子。

我們知道,當程式一執行,系統預設為該程序分別分配有一塊空間作為標準輸入緩衝區、標準輸出緩衝區和標準錯誤輸出緩衝區,預設與它們關聯的檔案描述符分別是0,1,2,程式中各種涉及到緩衝區的操作其實本質上也是通過它們的檔案描述來的。

demo1:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(void)
{
    int fd=open("./1.txt",O_RDWR|O_CREAT,0644);
    if(fd<0)
    {
        perror("open the 1.txt");
        goto err0;
    }
     int ret=dup2(fd, 1); // 讓本來指向標準輸出緩衝區的描述符1指向檔案1.txt
     if(ret<0)
     {
         perror("dup2");
		          goto err1;
     }
 
      printf("where am I?\n"); //向輸出緩衝區寫入資料
 
      close(fd);
      return 0;
err1:
     close(fd);
err0:
     return 1;
} 

上面程式中,先通過open()開啟檔案1.txt,得到與之關聯的檔案描述符fd,然後通過dop2()讓本來關聯著標準輸出緩衝區的檔案描述符0去關聯檔案1.txt,結果後面呼叫printf()向輸出緩衝區寫入內容時,它把1.txt誤當做了輸出緩衝區,於是語句“where am I?”被輸出到了1.txt檔案中:

demo2:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(void)
{
    int fd=open("./1.txt",O_RDWR|O_CREAT,0644);
    if(fd<0)
    {
        perror("open the 1.txt");
        goto err0;
    }
     int ret=dup2(fd, 0); // 讓本來指向標準入緩衝區的描述符0指向檔案1.txt
     if(ret<0)
     {
         perror("dup2");
		          goto err1;
     }

     char buf[128]="";
     gets(buf);  // 從輸入緩衝區讀取資料
     puts(buf);

     close(fd);
     return 0;
err1:
     close(fd);
err0:
     return 1;
}

同理,上面的程式中,讓本來關聯著標準輸入緩衝區的檔案描述符0現在關聯檔案1.txt(檔案中只有“where am I?”這一句話),當呼叫gets()從想輸入緩衝區讀取資料時,依然把檔案1.txt當做了標準輸入緩衝區,讀取了檔案中的“where am I?”並返回,所以終端也並沒有給使用者輸入資料的機會:

相關推薦

檔案描述複製函式dup2()

dup2()是dup()的“升級版“,原型是int dup2(int oldfd, int newfd),作用是讓檔案描述符newfd與oldfd所關聯的檔案(或緩衝區或管道或共享記憶體等)關聯起來,如果一開始newfd已經和某個檔案關聯了(一個描述符同一時刻只能關聯一個檔案

dup和dup2檔案描述相關函式

#include <unistd.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h>

Linux進程描述task_struct結構體--Linux進程的管理與調度(一)【轉】

mage ase 設備 兩種 等價 而且 當前 結構體 技術 Linux內核通過一個被稱為進程描述符的task_struct結構體來管理進程,這個結構體包含了一個進程所需的所有信息。它定義在include/linux/sched.h文件中。 談到task_struct結構體

檔案描述——select()函式以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

舉個例子,比如recv(), 在沒有資料到來呼叫它的時候,你的執行緒將被阻塞,如果資料一直不來,你的執行緒就要阻塞很久.這樣顯然不好。所以採用select來檢視套節字是否可讀(也就是是否有資料讀了) 。 步驟如下——socket s; ..... fd_set set; while(1) { FD_ZERO

Linux 檔案描述(file descriptor, fd)以及檔案描述操作dup(), dup2()

1.概述 在Linux系統中,一切皆可以看做是“檔案”,這裡“檔案”包括普通檔案、目錄檔案、連結檔案和裝置檔案等。而檔案描述符(file descriptor, 簡稱fd)是Linux核心所建立的索引,其目的為了高效管理已被開啟的“檔案”。其實,檔案描述符就是一個非負整數(

Python描述(descriptor)及應用場景

Python中包含了許多內建的語言特性,它們使得程式碼簡潔且易於理解。這些特性包括列表/集合/字典推導式,屬性(property)、以及裝飾器(decorator)。對於大部分特性來說,這些“中級”的語言特性有著完善的文件,並且易於學習。 但是這裡有個例外,那就是描

Unix環境程式設計之二:檔案描述、開啟檔案表、v節點關係

一、檔案描述符概念 Linux 系統中,把一切都看做是檔案,當程序開啟現有檔案或建立新檔案時,核心向程序返回一個檔案描述符,檔案描述符就是核心為了高效管理已被開啟的檔案所建立的索引,用來指向被開啟的檔案,所有執行I/O操作的系統呼叫都會通過檔案描述符。 二、檔案

linux dup,dup2,dup3 複製一個檔案描述

dup,dup2,dup3  --duplicate a file descriptor複製一個檔案描述符 大綱   #include <unistd.h>   int dup(int oldfd);   int dup2(int oldfd , int new

Linux:基礎IO(cIO庫函式詳細介紹)(IO系統呼叫介面詳細介紹)(兩者關係:檔案描述檔案指標)

目錄 c系統中的庫函式: fopen:開啟檔案 fclose:關閉檔案 fwrite:向檔案寫入一個數據塊 fread:讀寫 fprintf:格式化輸出到一個流/檔案中 fseek:移動/跳轉 到當前 讀取/寫入位置 fgets:獲取字串 fput:把字串寫入到指

Linux下select函式檔案描述0狀態的問題

當然是在有輸入或者輸出時檔案描述符的讀寫狀態改變咯,比如標準輸入的檔案描述符是0,如果用select來等待0號檔案描述符,那麼當在鍵盤上敲字元時開始,就是檔案描述符的讀寫狀態改變之時,這時select函式就會返回;對於套接字描述符來說也是這樣,用select來等待一個伺服器描

select函式檔案描述集的使用

轉載至:http://blog.csdn.net/zjf82031913/article/details/5617031Select在Socket程式設計中還是比較重要的,可是對於初學Socket的人來說都不太愛用Select寫程式,他們只是習慣寫諸如connect、acce

mybatis中的mapper介面檔案以及example類的例項函式以及

##Example example = new ##Example(); example.setOrderByClause("欄位名 ASC"); //升序排列,desc為降序排列。 example.setDistinct(false)//去

c++/c socket應用的區別:socket()函式返回檔案描述fd總是0的問題

最近在arm linux系統上面使用socket建立客戶端到伺服器的連線, 客戶端需要開2個socket連線2個不同的伺服器, 這兩個申請socket的過程都放在同一個類的成員函式中實現, 測試發現,每次拿到的socket的fd均為0。 這個id為0,雖然用起來沒有問題,但

linux—dup和dup2重定向檔案描述

【dup】 利用函式dup,我們可以複製一個描述符。傳給該函式一個既有的描述符,它就會返回一 個新的現有的最小的未被使用的描述符,這個新的描述符是傳給它的描述符的拷貝。這意味著,這兩個描述符共享同一

Python內建函式open()&檔案屬性方法

Python檔案物件開啟模式及其屬性方法詳解1、檔案系統和檔案檔案系統:檔案系統是OS用於明確磁碟或分割槽上的檔案的方法和資料結構,即在磁碟上組織檔案的方法檔案:儲存在某種長期儲存裝置或臨時儲存裝置中的一段資料流,並且受計算機檔案系統管理。概括來講,檔案是計算機中有OS管理的

檔案描述的重定向:dup/dup2

dup/dup2:進行檔案描述符的重定向即建立一個oldfd的副本。 dup:最低編號、未被使用的檔案描述符是oldfd的一份拷貝。 dup2:newfd是oldfd的一份拷貝。 返回值:成功(newfd); 失敗(-1)。 基於TCP的soc

c語言字數組與字串的使用

變量名 () 有效 檢測 指針變量 增加 ram 字符串 系統 轉自http://www.jb51.net/article/37456.htm 1、字符數組的定義與初始化字符數組的初始化,最容易理解的方式就是逐個字符賦給數組中各元素。char str[10]={ ‘I‘,‘

Python數據類型方法簡介一————字串的用法

python 字符串連接 字符串用法 符串是Python中的重要的數據類型之一,並且字符串是不可修改的。 字符串就是引號(單、雙和三引號)之間的字符集合。(字符串必須在引號之內,引號必須成對)註:單、雙和三引號在使用上並無太大的區別; 引號之間可以采取交叉使用的方式避免過多轉義;

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

系統 強調 操作 attach bsp ads 正常的 註意 tdi 正常的文件描述符: 在linux下,通過open打開以文件後,會返回一個文件描述符,文件描述符會指向一個文件表,文件表中的節點指針會指向節點表。看下圖: 打開文件的內核數據結構 dup和dup2兩

Javascript字串常用方法

cti cas substr ace spa sea clas ron earch 字符串 字符串就是一個或多個排列在一起的字符,放在單引號或雙引號之中。 ‘abc‘"abc" length屬性 js裏的字符串類似於數組,都是一個一個字符拼湊在一起組成的,因此可以用leng