C dup2在第行>时覆盖文件错误;1.

C dup2在第行>时覆盖文件错误;1.,c,cat,dup,C,Cat,Dup,我有下面这个简单的程序,它将infle链接到outfile char *execArgs[] = { "cat", NULL}; int outfile = open("outfile", O_WRONLY | O_CREAT, 0644); int infile = open("infile", O_RDONLY, 0); dup2(outfile, STDOUT_FILENO); dup2(infile, STDIN_FILENO); close(outfile)

我有下面这个简单的程序,它将infle链接到outfile

  char *execArgs[] = { "cat", NULL};
  int outfile = open("outfile", O_WRONLY | O_CREAT, 0644);
  int infile = open("infile", O_RDONLY, 0);
  dup2(outfile, STDOUT_FILENO); 
  dup2(infile, STDIN_FILENO); 
  close(outfile);
  close(infile);
  execvp(execArgs[0], execArgs);
现在,假设infle的内容是

this is infile
而outfile是

this is outfile
运行程序后,outfile的内容在末尾有一个额外的“e”

this is infilee
此外,如果输出文件为

this is outfile
this is outfile
它变成

this is infilee
this is outfile

出什么事了?

你正在经历的是预期的行为
cat
只写它读取的字节数,因此由于原始
outfile
更长,因此剩余的字节包含它们以前包含的内容

如果您问为什么使用shell执行时会出现不同的行为:

cat < infile > outfile
catoutfile

原因是shell使用
O_TRUNC
打开
outfile
(或
的任何目标),打开文件时会将文件长度截断为零。通过将
|O_TRUNC
添加到
open
调用的flags参数中,可以获得相同的行为。

尝试使用
O_TRUNC
这将截断它所存在的文件

int outfile = open("outfile", O_WRONLY | O_CREAT | O_TRUNC, 0644);
它没有一个额外的e,它在那个位置有相同的e

看看你正在写的字符串:

this is infilee
this is outfile
              ^
              +-- lines up
问题是输出没有被截断,因此它保留了所有的旧内容。您只是从一开始就覆盖它。

int outfile=open(“outfile”,O_WRONLY | O_CREAT,0644);该行导致问题,您只希望在输出文件不存在时创建。