2012-12-11 6 views
5

私のCプログラムで一時ファイルを作成し、それにデータを書き込んだり、外部コマンド(execまたはシステム経由)を呼び出して、今作成したファイルに対して何らかの処理を行う必要があります。私は外部コマンドを書いていないし、それを自分のプログラムに統合することもできないので、既に開いているディスクリプタを共有できるとは思えない。したがって、私は作成された一時ファイルの名前を知る必要があります。一時ファイルを開き、そのファイル名を取得するにはどうすればよいですか?

tempname()関数はこれを行いますが、残念なことに名前を取得してファイルを開くまでに競合が発生する可能性があり、推奨されない関数(tmpfileとmkstemp )は、作成されたファイルの実際の名前を見つける方法を提供します。

+2

'mkstemp'は名前を返します。渡されたテンプレート引数(char *、const char *ではなく)を変更して、Xを実際の値に置き換えます。 – Joe

答えて

5

mkstempはあなたが一時ファイル名を教えていない、自分自身を表示するには、このプログラムをコンパイルして実行しようというのは本当ではありません。

#include <stdlib.h> 
#include <stdio.h> 

int main() 
{ 
    char fn[] = "/tmp/fileXXXXXX"; 
    int fd = mkstemp(fn); 
    char cmd[200]; 
    int n = snprintf(cmd, sizeof(cmd), "ls -l %s\n", fn); 

    printf("snprintf=>%d\n sizeof(fn)=%d\n", n, sizeof(fn)); // extra info, see comments 

    printf("%s\n", cmd); 
    return system(cmd); 
} 

mkstempあなたが渡すバッファにファイル名のテンプレートに置き換えられます実際のファイル名で、このバッファで必要なものを後で実行することができます。

+0

ああ、そうです。マニュアルページの読んでいないことを私が逃したかどうかは分かりません。ありがとう! – Michael

+0

上記のように割り当てられた文字列を渡すと、__gen_tempnameにsegfaultが得られることに注意してください。もし私がそれをつかまえたら、私はしません。これはプラットフォームに依存するかもしれませんが、文字列定数が読み取り専用のセグメントに入れられることがあると思います。 – Michael

+1

@Michael私はコードがOKだと思います。私が 'fn'を' char'へのポインタとして宣言しなかったことに注目してください。これは実際には文字列リテラルデータで初期化されたローカル配列(スタック上にある)です。 – piokuc

関連する問題