Создание и удаление файлов из C / Stack Overflow

Кажется, я не совсем понимаю, как происходит удаление файлов в 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

3

Решение

Когда вы вызываете 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.
1

Другие решения


По вопросам рекламы [email protected]