Напомню, что в предыдущем посте мы пытались восстановить удаленный файл, не копируя его. У нас не получилось, но мы пробуем еще.
Пробуем. В Linux есть системный вызов
linkat(). Он поддерживает флаги AT_EMPTY_PATH и AT_SYMLINK_FOLLOW, которые позволяют создать хардлинк на файл по файловому дескриптору на него (в том числе по ссылке в /proc/<pid>/fd). На StackOverflow показывают пример, как можно сделать хардлинк по файловому дескриптору:fd = open("/tmp", O_TMPFILE | O_RDWR, 0600);
// write something to the file here
// fchown() / fchmod() it
linkat(fd, "", AT_FDCWD, "/tmp/test", AT_EMPTY_PATH);
Попробуем так же:https://pastebin.com/tkyY2abT
Увы, не работает: программа выдает
linkat: No such file or directory. Впрочем, man явно предупреждает, что ничего не выйдет, и среди ошибок упоминает> ENOENT An attempt was made to link to a /proc/self/fd/NN file corresponding to a file that has been deleted.
Вариант с
AT_SYMLINK_FOLLOW тоже ничего не дает:https://pastebin.com/vVz3zcR0
Так что, к сожалению, остается единственный способ — копировать.