C dup2在第行>时覆盖文件错误;1.
我有下面这个简单的程序,它将infle链接到outfileC 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)
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);该行导致问题,您只希望在输出文件不存在时创建。