[英]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*
, fopen
, fwrite
, fclose
)和原始文件操作(使用文件描述符, open
, write
, close
, dup2
)混合在一起。 特別是不要像在這段代碼中那樣將它們混合在同一文件指針/描述符上。
讓我們瀏覽一下代碼,以了解其行為方式:
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.