gpt4 book ai didi

c - 为什么dup2调用会出错?

转载 作者:行者123 更新时间:2023-11-30 17:18:16 25 4
gpt4 key购买 nike

如你所见,程序有两个文件指针sport和fruit指向文件fruit.txt。问题是运行程序后,sport.txt为空,而fruit.txt包含中文字符。我预计 sport.txt 应包含单词“篮球”,因为它是在重定向发生之前写入文件的。那么,这里出了什么问题?

#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相同的文件。实际数值保持不变,只是它们引用的实际文件发生了变化。这意味着两个 FILE 句柄将在 dup2 调用后写入同一个文件。

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

这将写入同一个底层文件,因为两个描述符现在引用同一个文件。但同样,由于流是缓冲的,这实际上可能只是附加到这两个 FILE* 的缓冲区。

fclose(sport);
fclose(fruit);

这会刷新缓冲区,因此实际写入磁盘的操作发生在这里。因为描述符已经改变,如果到现在为止没有发生刷新,两个流实际上都会刷新到磁盘上的同一个文件。

这可能就是您看到该行为的原因,但请记住,您所做的事情并不安全,并且行为或文件内容可能会有所不同。

关于c - 为什么dup2调用会出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29222561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com