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

そしてアウトファイルは

this is outfile

プログラムを実行した後、outfile の内容の最後に余分な「e」が追加されます。

this is infilee

また、出力ファイルが代わりに

this is outfile
this is outfile

あれは。。。になる

this is infilee
this is outfile

なにが問題ですか?

4

3 に答える 3

1

あなたが経験しているのは、予想される動作です。cat読み取ったバイト数を書き込むだけなので、元のoutfileほうが長いため、残りのバイトには以前に含まれていたものが含まれます。

シェルを使用して実行するのとは異なる動作が得られる理由を尋ねている場合:

cat < infile > outfile

その理由は、シェルoutfile(または の任意のターゲット>) がO_TRUNCで開くためです。これにより、ファイルを開く際にファイルの長さが 0 に切り捨てられます。呼び出しの 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 に答える