URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5647
[ Назад ]

Исходное сообщение
"Удаление файла имея только его дескриптор"

Отправлено apr2504 , 18-Авг-06 11:46 
Кто нибудь знает как осуществить сабж?

Содержание

Сообщения в этом обсуждении
"Удаление файла имея только его дескриптор"
Отправлено int_0d , 18-Авг-06 12:15 
>Кто нибудь знает как осуществить сабж?


man unlink?


"Удаление файла имея только его дескриптор"
Отправлено apr2504 , 18-Авг-06 13:27 
>man unlink?

#include <unistd.h>

int unlink(const char *pathname);

У меня есть только открытый дескриптор файла!!!



"Удаление файла имея только его дескриптор"
Отправлено int_0d , 18-Авг-06 13:37 
>>man unlink?
>
>#include <unistd.h>
>
> int unlink(const char *pathname);
>
>У меня есть только открытый дескриптор файла!!!
сорри, ступил.
из userspace я способов не вижу : (

"Удаление файла имея только его дескриптор"
Отправлено EL , 18-Авг-06 15:47 
>сорри, ступил.
>из userspace я способов не вижу : (
А что-то типа "find -inum XXX -exec rm -f {}"


"Удаление файла имея только его дескриптор"
Отправлено BsDr , 18-Авг-06 16:27 
1. Я не знаю получится или нет, ну вообщем вот! если есть дискриптор то можно попробовать так: man fstat, функция запишет структуру(struct stat *buf) может в ней и будет путь и имя файла, просто для меня не понятны названия этих полей! Затем unlink()!

2. Можно вначале открыть файл fopen(), в структуре  FILE есть поле в котором содержится путь файла! Затем unlink()!

Второй вариант точно будет работать!


"Удаление файла имея только его дескриптор"
Отправлено Forth , 18-Авг-06 16:34 
>1. Я не знаю получится или нет, ну вообщем вот! если есть
>дискриптор то можно попробовать так: man fstat, функция запишет структуру(struct stat
>*buf) может в ней и будет путь и имя файла, просто
>для меня не понятны названия этих полей! Затем unlink()!
>
>2. Можно вначале открыть файл fopen(), в структуре  FILE есть поле
>в котором содержится путь файла! Затем unlink()!
>
>Второй вариант точно будет работать!
1. Там много чего есть, а вот пути как раз и нету.
2. А где в FILE путь? Я там такого поля не вижу.

"Удаление файла имея только его дескриптор"
Отправлено apr2504 , 18-Авг-06 17:02 
>1. Я не знаю получится или нет, ну вообщем вот! если есть
>дискриптор то можно попробовать так: man fstat, функция запишет структуру(struct stat
>*buf) может в ней и будет путь и имя файла, просто
>для меня не понятны названия этих полей! Затем unlink()!
>
>2. Можно вначале открыть файл fopen(), в структуре  FILE есть поле
>в котором содержится путь файла! Затем unlink()!
>
>Второй вариант точно будет работать!

Собственно проблема-то возникла из-за того, что программа
открывает файл, потом делает chroot до конца работы. А файл-то
она удалить уже не сможет! Я вот думал может получить дескриптор
каталога командой opendir(), но там в структуре удалить не
удастся файл.


"Удаление файла имея только его дескриптор"
Отправлено Forth , 18-Авг-06 17:06 
>Собственно проблема-то возникла из-за того, что программа
>открывает файл, потом делает chroot до конца работы. А файл-то
>она удалить уже не сможет! Я вот думал может получить дескриптор
>каталога командой opendir(), но там в структуре удалить не
>удастся файл.
Надо файл держать внутри chroot.



"Удаление файла имея только его дескриптор"
Отправлено Ganduras , 06-Окт-06 11:53 
>Собственно проблема-то возникла из-за того, что программа
>открывает файл, потом делает chroot до конца работы. А файл-то
>она удалить уже не сможет! Я вот думал может получить дескриптор
>каталога командой opendir(), но там в структуре удалить не
>удастся файл.

В unix после удаления файла в ФС уже открытый дескриптор существует как ни в чем не бывало. Так что можно поменять местами, удалить файл сразу после его открытия. После того, как процесс будет завершен, он автоматически будет удален.

Если нужно удалить имя файла из ФС, когда это запросит процесс в chroot, можно до перехода его в chroot создать параллельный процесс, и ожидать этой команды через IPC - pipe, socketpair, mmap, shm*, sem* даже через flock с LOCK_EX на том самом дескрипторе.

Но в любом случае для удаления необходимо знать имя файла. Один физический файл может иметь несколько жестких ссылок в разных дирректориях.