簡體   English   中英

為什么dup2的調用出錯?

[英]Why does the calling of dup2 go wrong?

如您所見,該程序有兩個文件指針sport和指向文件fruit.txt的水果點。 問題在於,運行程序后,sport.txt為空,fruit.txt中包含漢字。 我希望sport.txt應該包含單詞“ basketball”,因為重定向之前它已寫入文件中。 那么,這是怎么了?

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include "../cus_header/cus_header.h"

int main(){

    FILE *fruit = fopen("fruit.txt", "w");
    if(!fruit)
        error("cannot open fruit.txt");

    FILE *sport = fopen("sport.txt", "w");
    if(!sport)
        error("cannot open sport.txt");

    int de_sport = fileno(sport);
    int de_fruit = fileno(fruit);

    printf("file number of sport.txt: %i and of fruit.txt: %i\n", de_sport, de_fruit);

    fwrite("basketball", sizeof(char), 10, sport);

    fwrite("apple", sizeof(char), 6, fruit);

    if(dup2(de_fruit, de_sport) == -1)
        error("cannot redirect");

    fwrite("basketball", sizeof(char), 10, sport); //???
    fwrite("apple", sizeof(char), 6, fruit); // ???

    fclose(sport);
    fclose(fruit);

    return 0;
}

正如評論所提到的,您不應將文件操作與流(使用FILE*fopenfwritefclose )和原始文件操作(使用文件描述符, openwriteclosedup2 )混合在一起。 特別是不要像在這段代碼中那樣將它們混合在同一文件指針/描述符上。

讓我們瀏覽一下代碼,以了解其行為方式:

FILE *fruit = fopen("fruit.txt", "w");
...
FILE *sport = fopen("sport.txt", "w");

您不必在意FILE結構的樣子,僅假設它將基礎文件描述符保留在某個位置即可。

int de_sport = fileno(sport);
int de_fruit = fileno(fruit);

您創建的局部變量具有與兩個FILE*引用相同的文件描述符。

fwrite("basketball", sizeof(char), 10, sport);
fwrite("apple", sizeof(char), 6, fruit);

您在兩個文件的每一個中寫一些東西。 由於C文件流默認情況下是緩沖的,因此可能不會立即在磁盤上實際寫入文件(在您的情況下不會)。

dup2(de_fruit, de_sport)

這將關閉文件描述符de_sport並使其與de_fruit引用同一文件。 實際數值保持不變,僅更改了它們所引用的實際文件。 這意味着在dup2調用之后,兩個FILE句柄將寫入同一文件。

fwrite("basketball", sizeof(char), 10, sport); //???
fwrite("apple", sizeof(char), 6, fruit); // ???

這將寫入同一基礎文件,因為兩個描述符現在引用同一文件。 但是同樣,因為流被緩沖了,所以實際上可能只是附加到這兩個FILE*的緩沖區上。

fclose(sport);
fclose(fruit);

這將刷新緩沖區,因此實際寫入磁盤的操作在此處進行。 因為描述符已更改,所以如果到目前為止沒有刷新,則兩個流實際上都將刷新到磁盤上的同一文件。

這可能就是您看到這種行為的原因,但請記住,您所做的操作並不安全,並且行為或文件內容可能有所不同。

暫無
暫無

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

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