2015-01-19 3 views
1

Я пытаюсь удалить файл, когда программа закончится. Я помню, что прежде чем я смог поместить unlink() перед первым close(), и мне не нужно снова открывать файл.auto delete file on linux

Что я ожидаю: файл стирается после завершения программы.

Что происходит: Файл стирается, когда вызов для разблокировки происходит, когда файл стирается.

Мой пример программы:

int main() 
{ 
    int fd = open(argv[1], O_CREAT); 
    int x = 1; 
    write(fd, "1234\n", 5); 
    close(fd); 

    fd = open(argv[1], 0); 
    unlink(argv[1]); 

    while (x <= 3) 
    { 
     int k; 
     scanf(" %d", &k); 

     x++; 
    } 

    close(fd); 
    return 0; 
} 

Есть способ, что я могу open() файл, взаимодействовать с ним и на close() удалить файл с жесткого диска? Я использую fedora linux 18.

Мне нужно знать имя файла, который я открыл, таким образом, потому что он будет использоваться другим приложением.

+2

'это не работает now' Можете ли вы описать как? Что-то происходит иначе, чем вы ожидаете? Вы получили сообщение об ошибке? – ajp15243

+0

Зачем вам удалять файл и удалять его? Разве он не закрывает файл, а затем удаляет его правильно? –

+1

@iharob это, чтобы иметь еще несколько гарантий, что никто не попытается изменить файл, пока он работает с ним ... –

ответ

1

Отключение файла просто отделяет имя файла от основного inode, что делает невозможным открытие файла с использованием этого имени файла впоследствии.

Если какой-либо процесс имеет открытый файл, он может с радостью прочитать и записать его, поскольку эти операции работают с inode, а не с именем файла. Кроме того, если есть жесткие ссылки (другие имена файлов, относящиеся к одному и тому же inode), эти другие имена файлов могут использоваться, чтобы открыть файл просто отлично. См. статью Википедии о inodes для получения дополнительной информации.


Edited добавить:

В Linux, вы можете использовать в /proc pseudofilesystem. Если ваше приложение (с идентификатором процесса PID) имеет дескриптор файла FD open, с уже отсоединенным именем файла, он может позволить другому приложению работать на нем, сообщая другому приложению работать с /proc/PID/fd/FD. Это псевдо-файл, то есть он выглядит как (неработающая!) Символическая ссылка, но это не так - это просто полезная магия ядра Linux: пока другое приложение просто открывается нормально (open()/fopen() и т. Д. нет lstat()/readlink()), они получат доступ, как если бы они открывали нормальный файл.

В реальном мире, например, открытые два терминала, и в одной записи

bash -c 'exec 3<>foobar ; echo $$ ; rm foobar ; echo "Initial contents" >&3 ; cat >&3' 

Первая строка выводит это PID и FD является 3 здесь. Все, что вы набираете (после нажатия Enter), будет добавлено к файлу, который был вкратце назван foobar, но больше не существует. (Это легко проверить.)

Во втором терминале, тип

cat /proc/PID/fd/3 

, чтобы увидеть, что содержит этот файл.

+0

Да, но я считаю неправильным тот факт, что файл исчез до того, как я закрыл. Если он исчезнет, ​​другая программа не сможет открыть его, не узнав индекс. –

+0

@RicardoLucca: Расскажите другому процессу использовать '/ proc/PID/fd/FD', где' PID' - это исходный процесс pid, а 'FD' - дескриптор файла в исходном процессе. См. Мой отредактированный ответ. –

1

Это походит на то, что вы на самом деле хочу tmpfile():

Функция tmpfile() открывает уникальный временный файл в двоичном чтения/записи (ш + б) режим. Файл будет автоматически удалён, если он завершен или программа завершается.

+0

Извините, но мне нужно знать имя файла. Возможно ли это имитировать через open/fopen? –

0

Файл не подключен, поэтому он не будет отображаться с ls ... но файл все еще существует, есть индексный дескриптор, и вы действительно можете его повторно связать ... файл не будет удален из диск, пока все дескрипторы файлов, указывающих на него закрыты ...

еще можно было читать и писать на ФД, пока он открыт после того, как он отсоединил ...