簡體   English   中英

將管道的讀取端重定向到文件描述符

[英]redirect pipe's read end to a file descriptor

我有兩個子進程,它們共享其父級的公共管道描述符。 關閉結束等沒有問題。問題是我希望將管道的讀取端重定向到文件描述符,而不是持有緩沖區並將緩沖區的內容寫入文件。 可能嗎? 我的代碼段如下

// we're sure we can read from fd[0], I did it sucessfully
// I mean there is no problem about the communication

int open_fd = open(filename, O_WRONLY|O_CREAT, 0666);
if (dup2(open_fd,fd[0]) == -1) {
    perror("error ");
    return 1;
}
if (close(open_fd) == -1) {
    perror("close error");
    return 1;
}

當我執行上述代碼時,我沒有寫到名為filename 順便說一句,是否需要通過調用close(open_fd) 由於dup2已經關閉它。

您可能誤解了dup2的目的。 它只是改變了文件描述符的“含義”,因此它現在“指向”與另一個描述符相同的流。 但這絕不會將數據從一個文件描述符傳輸到另一個文件描述符。 要真正實現您想要的目標,可以嘗試拼接

int open_fd = open(filename, O_WRONLY|O_CREAT, 0666);
splice(fd[0], NULL, open_fd, NULL, size, 0);

請注意,您必須指定要傳輸的數據量(上例中為size變量)。

當我執行上述代碼時,我沒有寫到名為filename

當然不是。 當您調用dup2(open_fd,fd[0]) ,您使存儲在fd[0]的整數值引用的文件與open_fd文件相同,但這與饋入字節的字節沒有直接關系。寫管道的末端。 它通過使最初存儲在fd[0]文件描述符號(如果打開)首先關閉,從而僅間接影響它們。

文件描述符基本上是映射表的鍵,該表將整數映射為在內核中打開文件描述。 dup2()更改目標FD映射到的打開文件描述; 它不會修改打開的文件描述本身或影響它的語義,它是在那個水平,管生活。

通過讀取管道,可以從管道的讀取端獲取寫入管道寫入端的字節。 但是,您這樣做時,它們最初位於內存和/或CPU寄存器中。 為了使它們從那里轉到文件,您需要它們發送到那里。 例如,您可能設置了一個線程,其目的是從管道中讀取任何可用的字節,然后將它們寫入您的文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM