Ситуация такая -- начал недавно программировать в linux под с++, вот и что-то вопросы какие-то появляются.
1. Подскажите пожалуйста, функцию, чтобы можно было переместить файл.
Или это только можно сделать связкой -- скопировать фаайл, а затем удалить оригинал??
Просто судя по времени перемещения файла, как это делают, например, файловые менеджеры, они не копируют файл, а просто вносят изменения в файловую таблицу, но это конечно же при условии, что src и dst находятся в одном разделе.
2. Подскажите пожалуйста, можно ли выполнять команды shell, сделав запрос из тела программы?? и где почитать об этом.
3. Подскажите ещё один маленький вопрос -- а где же можно взять man.pages или информацию в другом виде по syscall??
Извините, что так много вопросов
Заранее признателен. ^_^
1.а ты глянь исходник mv - узнаешь как это сделать оптимально.
2.команды шелл? встроенные? думаю нет (вероятно через ж**** все можно)
3.opennet например
Или это только можно сделать связкой -- скопировать фаайл, а затем удалить оригинал??
Да.
mv a b == cp a b && rm a ? я тоже хочу такую траву)
2some one else:
1. man 2 rename - "rename - change the name or location of a file"
в случае перемещения/переименования файла изменяется только блок описания директории, в который находился/будет находиться файл. а блоки самого файла никоим образом не затрагиваются.
2. man 3 system - "system - execute a shell command"
3. Asgard уже ответил
2.6.14-gentoo-r5 kde-3.5.0 | openbox-3.2 Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
d_Sun, интересно, если у меня на флэшке размером в 128 метров лежит стометровый файл, то я не смогу его переместить в другую папку на флэшке? если mv == cp && rm, то для cp на флэшке не хватит места....
а как же я тогда спокойно перемещаю файлы в таких условиях?
ответ просто: mv != cp && mv
получается, что вот как раз на системном уровне все происходит совсем не так, как ты тут пытаешься доказать...
d_Sun, интересно, если у меня на флэшке размером в 128 метров лежит стометровый файл, то я не смогу его переместить в другую папку на флэшке? если mv == cp && rm, то для cp на флэшке не хватит места....
а как же я тогда спокойно перемещаю файлы в таких условиях?
ответ просто: mv != cp && mv
получается, что вот как раз на системном уровне все происходит совсем не так, как ты тут пытаешься доказать...
Хм... Действительно... Признаю свою ошибку Но как ты прокомментируеш исходник который я кидал выше?
Как и обещал, привожу небольшое описание того, что происходит "на системном
уровне".
Рассмотрим некую абстрактную файловую систему. Любая файловая система в UNIX
оперирует объектами двух типов - это логический блок и inode.
Логический блок является атомарным объектом данных. Обычно имеет размер 1Kb, 2Kb
или 4 Kb. В любом случае, размер логического блока всегда должен быть кратен
размеру блока блочного устройства (обычно 512b).
inode - это любой объект файловой системы (файл, директория, симлинк, файл
блочного и символьного устройств, пайп, unix-сокет). В inode хранится (в общем случае,
не зависимо от типа фс):
- информация о владельце (uid и gid)
- timestams (access time, modification time и change time)
- права доступа
- тип inod'ы (файл, директория, симлинк и т.п.)
- размер
- список номеров логических блоков, используемых данной inode'ой
- счетчик использования (use или reference counter, кому как больше нравится)
* Заметьте, что имя обьекта в inode _не_ содержится.
Теперь рассмотрим три типа inode. Файл, симлинк и директорию.
С файлом все просто - содержимое файла хранится в логических блоках,
перечисленных в inode.
Симлинки. Логические блоки симлинка содержат строку пути к файлу, на
который этот линк указывает. Стоит добавить, что в большинстве фс симлинк
может не иметь логических блоков вообще - в том случае если строка пути
умещается в inode в поле списка номеров логических блоков.
Директория. Логические блоки директории содержат в себе номера inode и имена
файлов (симлинков, директорий и т.п.), которые содержатся в директории.
Единственный нюанс (касается всех типов inode) - inode'а содержит в себе только
номера N первых блоков файла (inode'а содержит N+M полей зарезервированных для
номеров блоков). Если файл не помещается в N блоков - используется косвенная
адресация. N+1'ый номер блока в inode указывает на блок, содержащий номера
блоков файла с N+1 по N+K (где K = размер блока / sizeof(int)). Это блок
косвенной адресации первого рода. N+2 блок в inode указывает на блок косвенной
адресации второго рода (содержит номера блоков косвенной адресации первого
рода). И так далее до N+M.
Теперь собственно о том, что же происходит, когда мы делаем ln, unlink, rmdir,
cp и mv (rm не рассматриваем, поскольку аналогично unlink || rmdir).
ln source dstpath/dstname(без -s):
В логические блоки директории dstpath добавляется новая запись с именем dstname
и номером inode таким же, как и у исходного файла. Reference counter inode'ы
этого файла увеличивается на 1.
unlink source:
Reference counter inode'ы уменьшается на 1 и запись о файле удаляется из
логических блоков директории. Если счетчик достигает значения 0, блоки
занимаемые файлом и inode помечаются как свободные (используется битовая карта
логических блоков и битовая карта inode). Если случиться так, что inode'a не
упоминается ни в одной из директорий, но имеет ref.cnt. > 0, такая inode'a считается
сиротой (orphan), о чем с радостью сообщит fsck.
rmdir source:
В случае, если директория пуста, запись о ней удаляется из родительской
директории и inode'а директории освобождается, так же как и в случае unlink. Так
же reference counter _родительской_ директории уменьшается на 1 (ref.cnt. для
директорий содержит количество дочерних директорий, включая . и ..).
cp source dstpath/dstname (в случае копирования файла):
Выделяется новая inode и новые логические блоки на фс содержащей dstpath. В
директорию dstpath добавляется новая запись с именем dstname и номером новой
inode'ы. Затем содержимое блоков исходного файла копируется в блоки нового
файла.
mv source dstpath/dstname (в случае файла):
Если source и dstpath/dstname находятся на одной файловой системе, то действия
аналогичны ln && unlink. (rename == link + unlink)
Если source и dstpath/dstname находятся на разный файловых системах, то действия
аналогичны cp && unlink.
PS. Мож пригодиться кому.
2.6.14-gentoo-r5 kde-3.5.0 | openbox-3.2 Deep Purple | Rob Zombie | Led Zeppelin | ДДТ