一部のプログラムは、「アンインストーラ」ソフトウェアのダウンロードとインストール、電子メールやインスタントメッセージングプログラムでのファイルのオープン、ファイルの転送など、実行中に多数の一時ファイルを生成します。
一時ファイルの使用に関する注意
- プログラム複数のプロセスが同時に実行されている可能性があり、それらは異なる一時ファイルを使用する必要があります。
- ファイル属性の設定には注意してください。許可されていないユーザーが一時ファイルにアクセスできないようにする必要があります。
- 一時ファイルの生成は外部から予測できないものにする必要があります。そうしないと、システムが攻撃に対して脆弱になります。
一時ファイル関連機能の概要
mkstemp()
Linuxの一時ファイルは、mkstemp()関数によって作成されます。この関数には、char*テンプレートという1つのパラメーターしかありません。この文字列は「XXXXXX」で終わる
必要があることに注意してください。mkstemp関数は、「XXXXXX」をランダムに生成された文字列に置き換えて、ファイル名の一意性を確保します。 関数の戻り値はファイル記述子であり、実行が失敗した場合は-1です。
unlink()
一時ファイルは使用後すぐに削除する必要があります。そうしないと、一時ファイルディレクトリがゴミでいっぱいになります。
mkstemp関数によって作成された一時ファイルは自動的に削除できないため、mkstemp関数の実行後にunlink関数を呼び出す必要があります。unlink関数はファイルのディレクトリエントリを削除しますが、ファイルから一時ファイルにアクセスできます。最後に開いたプロセスがファイル演算子を閉じるまでの記述子。または、プログラムの終了後に一時ファイルが自動的に完全に削除されます。
コード
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <unistd.h>
using namespace std;
int WriteToTempFile(char* buff, size_t length)
{
//创建临时文件
char file_name[] = "/tmp/temp.file.XXXXXX";
int fd = mkstemp(file_name);
//取消文件连接 不显示该临时文件
//关闭文件描述符后 临时文件会被删除
unlink(file_name);
write(fd, &length, sizeof(length));
write(fd, buff, length);
//返回文件描述符
return fd;
}
char* ReadFromTempFile(int fd, size_t* length)
{
//定位文件开头
lseek(fd, 0, SEEK_SET);
read(fd, length, sizeof(size_t));
char* buff = new char[*length];
read(fd, buff, *length);
close(fd);
return buff;
}
int main ()
{
char buff[] = "test temporary file write and read";
int fd = WriteToTempFile(buff, strlen(buff));
size_t len = 0;
cout << endl;
char* result = ReadFromTempFile(fd, &len);
cout << result << endl;
cout << endl;
return 0;
}