Кажется, я не совсем понимаю, как происходит удаление файлов в Linux (такое же поведение в Mac OS X). Следующий код записывает файл размером 1 ГБ, а затем немедленно удаляет его. Это делает 1024 раза. Я подумал, что, поскольку файл закрыт, он будет немедленно удален (освободится место и, возможно, будет переработан дескриптор файла). Вместо этого, если я смотрю на lsof
файл по-прежнему считается принадлежащим процессу (с добавлением (удаленным) к нему). Если я смотрю на df
, пространство все еще израсходовано. В конце концов, процесс умирает либо от исчерпания разрешенного количества открытых файлов, ограничения, которое я могу повысить, либо просто от нехватки места.
Какой правильный способ сделать это? Могу ли я на самом деле удалить файл до завершения процесса (и освободить его место), или это безнадежное упражнение, и мне нужен другой дизайн для моего кода?
#include <unistd.h>
#include <cstdlib>
#include <cstdio>
#include <fcntl.h>
#include <iostream>
int main()
{
size_t n = 1024*1024*1024;
void* buffer = malloc(n);
std::cout << "Buffer created" << std::endl;
for (unsigned i = 0; i < 1024; ++i)
{
char filename[50] = "STORAGE.XXXXXX";
mkstemp(filename);
std::cout << filename << std::endl;
int fh = open(filename, O_WRONLY | O_SYNC, 0600);
write(fh, buffer, n);
close(fh);
remove(filename);
}
free(buffer);
sleep(60);
}
Lsof:
test-remo 29251 ... 3u REG 8,51 1073741824 9307914 .../tmp/STORAGE.Tyj4oG (deleted)
test-remo 29251 ... 4u REG 8,51 1073741824 9308254 .../tmp/STORAGE.fBkF5b (deleted)
test-remo 29251 ... 5u REG 8,51 1073741824 9308030 .../tmp/STORAGE.xfJ9P0 (deleted)
test-remo 29251 ... 6u REG 8,51 1073741824 9308538 .../tmp/STORAGE.0C6oea (deleted)
test-remo 29251 ... 7u REG 8,51 1073741824 9306147 .../tmp/STORAGE.w9dPzC (deleted)
test-remo 29251 ... 8u REG 8,51 1073741824 9308311 .../tmp/STORAGE.mIwcpq (deleted)
test-remo 29251 ... 9u REG 8,51 1073741824 9309004 .../tmp/STORAGE.srTZfy (deleted)
test-remo 29251 ... 10u REG 8,51 1073741824 9309284 .../tmp/STORAGE.xjQQ4Y (deleted)
test-remo 29251 ... 11u REG 8,51 1073741824 9309291 .../tmp/STORAGE.ioyPxI (deleted)
test-remo 29251 ... 12u REG 8,51 1073741824 9307415 .../tmp/STORAGE.saYo2L (deleted)
test-remo 29251 ... 13u REG 8,51 1073741824 9307810 .../tmp/STORAGE.ylW467 (deleted)
test-remo 29251 ... 14u REG 8,51 1073741824 9308666 .../tmp/STORAGE.lUYnWN (deleted)
test-remo 29251 ... 15u REG 8,51 1073741824 9309678 .../tmp/STORAGE.1rZM4M (deleted)
test-remo 29251 ... 16u REG 8,51 1073741824 9309702 .../tmp/STORAGE.wdggra (deleted)
test-remo 29251 ... 17u REG 8,51 1073741824 9309687 .../tmp/STORAGE.qczYAS (deleted)
test-remo 29251 ... 18u REG 8,51 1073741824 9309732 .../tmp/STORAGE.u0IxKV (deleted)
test-remo 29251 ... 19u REG 8,51 1073741824 9309708 .../tmp/STORAGE.6SiMpi (deleted)
test-remo 29251 ... 20u REG 8,51 1073741824 9308649 .../tmp/STORAGE.URky5Z (deleted)
test-remo 29251 ... 21u REG 8,51 1073741824 9309740 .../tmp/STORAGE.j8wEq2 (deleted)
test-remo 29251 ... 22u REG 8,51 1073741824 9309677 .../tmp/STORAGE.Wj5rco (deleted)
test-remo 29251 ... 23u REG 8,51 1073741824 9309828 .../tmp/STORAGE.I38ln3 (deleted)
test-remo 29251 ... 24u REG 8,51 1073741824 9309839 .../tmp/STORAGE.ent8I1 (deleted)
test-remo 29251 ... 25u REG 8,51 1073741824 9309843 .../tmp/STORAGE.1361nk (deleted)
test-remo 29251 ... 26u REG 8,51 1073741824 9309824 .../tmp/STORAGE.ue2WkW (deleted)
test-remo 29251 ... 27u REG 8,51 1073741824 9312037 .../tmp/STORAGE.4MdKsR (deleted)
test-remo 29251 ... 28u REG 8,51 1073741824 9312042 .../tmp/STORAGE.EgDft5 (deleted)
test-remo 29251 ... 29u REG 8,51 1073741824 9312059 .../tmp/STORAGE.NRcqlE (deleted)
test-remo 29251 ... 30u REG 8,51 1073741824 9309847 .../tmp/STORAGE.cF9qYw (deleted)
test-remo 29251 ... 31u REG 8,51 1073741824 9312103 .../tmp/STORAGE.wzfhSI (deleted)
test-remo 29251 ... 32u REG 8,51 1073741824 9312120 .../tmp/STORAGE.hfdv1d (deleted)
test-remo 29251 ... 33u REG 8,51 1073741824 9312090 .../tmp/STORAGE.kSX2D4 (deleted)
test-remo 29251 ... 34u REG 8,51 1073741824 9309813 .../tmp/STORAGE.FWKVGf (deleted)
test-remo 29251 ... 35u REG 8,51 1073741824 9312148 .../tmp/STORAGE.CYPGGL (deleted)
test-remo 29251 ... 36u REG 8,51 1073741824 9312171 .../tmp/STORAGE.it4bmC (deleted)
test-remo 29251 ... 37u REG 8,51 1073741824 9312145 .../tmp/STORAGE.IGSzVO (deleted)
test-remo 29251 ... 38u REG 8,51 1073741824 9312228 .../tmp/STORAGE.CMSOil
Когда вы вызываете mkstemp
, он не только создает временный файл, он также открывает его и возвращает дескриптор файла.
#include <unistd.h>
#include <cstdlib>
#include <cstdio>
#include <fcntl.h>
#include <iostream>
int main()
{
size_t n = 1024*1024*1024;
void* buffer = malloc(n);
std::cout << "Buffer created" << std::endl;
for (unsigned i = 0; i < 1024; ++i)
{
char filename[50] = "STORAGE.XXXXXX";
int fh;
fh = mkstemp(filename);
// close(fh)
std::cout << filename << std::endl;
// fh = open(filename, O_WRONLY | O_SYNC, 0600);
write(fh, buffer, n);
close(fh);
remove(filename);
}
free(buffer);
sleep(60);
}
Если вы хотите открыть его с помощью WRONLY и SYNC, вы должны сначала закрыть возвращенный дескриптор файла, а затем снова открыть его, если хотите. В этом случае просто удалите //
комментарии перед close
а также open
или используйте mkostemp
вместо.
NAME
mkstemp, mkostemp, mkstemps, mkostemps - create a unique temporary file
SYNOPSIS
#include <stdlib.h>
int mkstemp(char *template);
int mkostemp(char *template, int flags);RETURN VALUE
On success, these functions return the file descriptor of the temporary file.
On error, -1 is returned, and errno is set appropriately.