3

このmkstemp()関数は、テンプレートから一意の一時ファイル名を生成し、ファイルを作成して開き、ファイルの開いているファイル記述子を返します。テンプレートの最後の 6 文字は「XXXXXX」である必要があり、これらはファイル名を一意にする文字列に置き換えられます。テンプレートは変更されるため、文字列定数ではなく、文字配列として宣言する必要があります。

テンプレートをファイル名を一意にする文字列に置き換えた後、後で使用するために文字列を保存します。これは、私が頭を包み込むことができないような奇妙な問題に遭遇しているところです。正しいファイル名を端末に出力し、ファイル エクスプローラーでファイルを表示し、それを開いて正しい内容を確認できますが、実行するコマンドの一部として文字列を含めるpopen()と、空のファイルへのポインターが取得されます。ただし、一時ファイルの名前をコードにハードコーディングして再度実行すると、期待どおりの正しい結果が得られます。見落としているものや見逃しているものはありますか? コード スニペットを次に示します。

char tmpname[] = "tmp.XXXXXX";
FILE *fpt = fdopen(mkstemp(tmpname), "w");
string saved_tmpname(tmpname);
// blah
// write to file
// blah blah
const string command = "mycommand " + saved_tmpname;
cout << command << endl; // prints correctly
FILE *fpipe = popen(command.c_str(), "r");
if (fpipe == NULL) {
  perror(command.c_str());
}
char buff[4096];
while (fgets(buff, 4096, fpipe)) {
  // we don't get here!
}
4

1 に答える 1

4

のマンページからmkstemp

ファイルは open(2) O_EXCLフラグで開かれ、呼び出し元がファイルを作成するプロセスであることを保証します。

O_EXCLフラグを使用すると、ファイルを再度開くことができなくなります。これは一時ファイルなので問題ありません。1 つのプロセス (作成者) だけがアクセスできる必要があります。一時ファイルには機密データが含まれている場合があります。

于 2012-03-07T03:59:52.767 に答える