2016-07-09 2 views
0

一時ファイルを作成するのにstd :: tmpfile()を使用していますが、/ tmp以外の場所を使用したいとします。私は$ TMPDIRを新しい場所を指すようにエクスポートしていますが、std :: tmpfile()は新しい場所を選択しません。std :: tmpfile()がTMPDIRの場所を選択しない

/tmp以外のフォルダにstd :: tmpfile()を使用して一時ファイルを作成するにはどうすればよいですか?

+0

彼らは本当にできないように/ procファイルシステムの外部から回復される –

+1

'tmpfile'はこのような環境変数を使用するとは言いません。 [Linuxのマニュアルページ](http://man7.org/linux/man-pages/man3/tmpfile.3.html)では、「Glibcは ''に定義されたパス接頭辞 'P_tmpdir'を試していますが、それだけです。 –

+0

'P_tmpdir'の場所はどのように設定できますか?それは私の問題を解決するだろうか? –

答えて

1

簡単なテストプログラム

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

int main() 
{ 
    const char* tf = std::tmpnam(nullptr); 
    std::cout << "tmpfile: " << tf << '\n'; 
    return 0; 
} 

とltraceの

[email protected]:~$ ltrace ./test.exe 
__libc_start_main(0x400836, 1, 0x7ffedf17e178, 0x4008e0 <unfinished ...> 
_ZNSt8ios_base4InitC1Ev(0x601171, 0xffff, 0x7ffedf17e188, 160)     = 0 
__cxa_atexit(0x400700, 0x601171, 0x601058, 0x7ffedf17df50)      = 0 
tmpnam(0, 0x7ffedf17e178, 0x7ffedf17e188, 192)         = 0x7fe4db5a0700 
_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(0x601060, 0x400965, -136, 0x7fe4db2d13d5) = 0x601060 
_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(0x601060, 0x7fe4db5a0700, 0x601060, 0xfbad2a84) = 0x601060 
_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c(0x601060, 10, 0x7fe4db91d988, 0x57474f44696b656ctmpfile: /tmp/filekiDOGW 
) = 0x601060 
_ZNSt8ios_base4InitD1Ev(0x601171, 0, 0x400700, 0x7fe4db59fd10)     = 0x7fe4db922880 
+++ exited (status 0) +++ 

はmanページあたりに、何の環境変数がstd::tmpnamから相談されていない、それが唯一の定数であるP_tmpdirを使用して、ことを確認します。これは、Linuxのために純粋である場合

、あなたの代わりにmkstempを使用することもできます。

#include <stdio.h> 
#include <stdlib.h> 
#include <cstdlib> 
#include <iostream> 
#include <unistd.h> 

int main() 
{ 
    char tmpl[] = "/var/tmp/testXXXXXX"; 
    int f = mkstemp(tmpl); 
    if (f < 0) { 
     std::cerr << "mkstemp failed\n"; 
     return 1; 
    } 
    std::cout << tmpl << '\n'; 
    close(f); 
    return 0; 
} 

デモ:Linuxの実装は、実際にファイルのリンクを解除することを言われて

[email protected]:~$ g++ -o test.exe test.cpp -std=c++14 
[email protected]:~$ ./test.exe 
/var/tmp/testEFULD4 
関連する問題