2012-03-07 5 views
3

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

テンプレートをファイル名を一意にする文字列に置き換えた後、後で使用するために文字列を保存します。これは私の頭を包み込むことができない奇妙な問題に直面しているところです。私は端末に正しいファイル名を印刷し、ファイルエクスプローラのファイルを見て正しい内容を見るために開きますが、popen()で実行するコマンドの一部として文字列を含めると、空のファイルへのポインタが得られます。しかし、テンポラリーファイルの名前を自分のコードにハードコードして再実行すると、私は期待している正しい結果を得ます。私は見落としているか何かがありますか?ここでは、コードスニペットである:mkstempのマンページから

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! 
} 

答えて

3

ファイルは、発信者がファイルを作成する過程であることを保証する、オープン(2)O_EXCLフラグで開かれます。

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

関連する問題