1

我有以下将 infile 连接到 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);

现在,假设 infile 的内容是

this is infile

和outfile是

this is outfile

运行程序后,outfile的内容最后多了一个“e”,这样

this is infilee

此外,如果 outfile 是

this is outfile
this is outfile

它成为了

this is infilee
this is outfile

怎么了?

4

3 回答 3

1

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

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

cat < infile > outfile

原因是 shell 打开outfile(或 的任何目标>O_TRUNC,它会将文件截断为零长度作为打开它的一部分。您可以通过添加调用的 flags 参数| O_TRUNC来获得相同的行为。open

于 2014-10-18T19:54:57.643 回答
0

尝试使用O_TRUNC它会截断它存在的文件。

int outfile = open("outfile", O_WRONLY | O_CREAT | O_TRUNC, 0644);
于 2014-10-18T19:54:58.133 回答
0

它没有额外的e,它具有与该位置始终相同的 e。

查看您正在编写的字符串:

this is infilee
this is outfile
              ^
              +-- lines up

问题是输出没有被截断,因此它保留了所有旧内容。你只是从一开始就覆盖它。

于 2014-10-18T19:55:56.293 回答