我对部分感到困惑:
现在图表说每个指针都是32/64位.
该图表示,每个指针的一个数据块{8 KB} {4字节/ 8字节}
通常,要更改符号链接目标,首先取消链接文件,然后使用新目标路径重新创建符号链接.但是,它将被分配一个新的inode编号.
也许有一个私有的Mac api update_target_for_symlink()功能,所以inode可以保持不变?
如果你想知道我需要它...文件管理器.我怀疑这是否可能.无论如何这就是它的有趣之处.
我需要知道如何获取路径名或dentry从struct file给定的索引节点。
我曾经使用从路径名file_open获取struct file但总是给出内核恐慌。我需要一种方法来将我的 inode 列表中的 inode 与路径名中的 inode 进行比较,或者比较磁盘中的所有 inode 以找到相应的路径名,然后与我的 inode 列表进行比较。
如果我们执行一个命令:
mv A B
Run Code Online (Sandbox Code Playgroud)
那么文件A的inode中的字段会发生什么?它会改变吗?
我不认为它应该只是通过更改文件的名称来改变,但我不确定.
摘要:我想i_generation从用户空间获取 Linux(或至少 ext4)中文件的生成号 ( )。或者,“出生时间”(文件创建时间)。
我正在尝试编写一个双向文件同步程序(又名Unison),但没有中央数据库(简单,只需将数据存储在同步根中)并且通过保留文件移动(如果您想支持所有文件移动,则非常非常困难)例如,奇怪的情况,例如将文件移出随后删除的目录)。
拥有一种唯一标识文件的方法将使事情变得容易很多。我知道如何获取 inode 和设备号(通过stat),但由于 inode 可以重复使用(我自己也见过),我想使用更稳定的唯一标识。
我读过 NFS 使用“世代号”来唯一标识文件。在 NFS 中,( st_ino, i_generation) 组合用于在重新启动和服务器崩溃时唯一标识文件句柄(或至少防止重复使用同一文件句柄导致可能的数据损坏)。
不过我还没成功拿到号码。这个 ext4 文档似乎表明可以从 ext4 文件系统获取该数字,但我无法从用户空间获取它(我不会在内核空间中运行这个简单的程序)。看EXT4_IOC_GETVERSION。我在我的系统上找不到合适的头文件(LMDE、Debian 测试)。我可以找到两种选择:
EXT2_IOC_GETVERSIONin <linux/ext2_fs.h>- 给出EBADF( errno9)。也许是因为我试图从 EXT4 文件系统获取 EXT2 信息?或者也许我做错了什么ioctl,这是我第一次尝试使用它。文件被正确打开,因为open在我的例子中调用返回 3 (这应该是有效的)。代码:
#include <sys/ioctl.h>
#include <sys/fcntl.h>
#include <linux/ext2_fs.h>
#include <stdio.h>
#include <errno.h>
int main () {
int fileno = open("generation.c", O_RDONLY); …Run Code Online (Sandbox Code Playgroud) ll /srv/node/dcodxx/test.sh
-rw-r--r--. 1 root root 7 Nov 5 11:18 /srv/node/dcodxx/test.sh
Run Code Online (Sandbox Code Playgroud)
文件的大小以字节为单位显示。此文件存储在块大小为 4096 字节的 xfs 文件系统中。
xfs_info /srv/node/sdaxx/
meta-data=/dev/sda isize=256 agcount=32, agsize=7630958 blks
= sectsz=4096 attr=2, projid32bit=0
data = bsize=4096 blocks=244190646, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0
log =internal bsize=4096 blocks=119233, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
Run Code Online (Sandbox Code Playgroud)
这是否意味着一个块可以容纳多个文件,否则剩余字节 (4096-7) 会发生什么?另外,为 inode 保留的 256 字节存储在哪里,如果它与文件存储在同一块中,文件大小不应该更大(256 + 7)吗?
我是我大学系统编程课的助教。最近,学生们正在完成一项涉及复制该程序的作业pwd。
一些学生注意到了似乎不一致的地方。当他们从 readdir 条目中读取 ino 时,它会给出与统计同一目录时不同的 inode。他们中的许多人都在问为什么。目录项的索引节点不应该指向目标目录所在的索引节点吗?如果是这样,为什么 stat 给出不同的 inode?
这是一些示例代码来演示:
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#define DIR_NAME "~redacted~"
int getReaddirInode(char* entName)
{
DIR* directory;
struct dirent* entry;
ino_t result;
if ((directory = opendir(".")) == NULL)
{
perror("opendir");
exit(1);
}
while ((entry = readdir(directory)) != NULL)
{
if (strcmp(entName, entry->d_name) == 0)
{
result = entry->d_ino;
break;
}
}
if (entry == NULL)
{
fprintf(stderr, "No such directory: %s.\n", …Run Code Online (Sandbox Code Playgroud) 我将 inode 解释为指向文件实际存储位置的指针。
但我的理解有问题:
如果我在已经存在的cp file1 file2地方使用,inode 不会改变。如果最初存在指向 file2 的硬链接,那么它们现在都指向刚刚复制到此处的新文件。file2
但是当我使用时mv file1 file2,inode 变成了 的 inode file1。
假设两个不同的进程独立打开同一个文件,因此在打开文件表(系统范围)中具有不同的条目。但它们引用相同的 i 节点条目。
由于文件描述符引用打开文件表(系统范围)中的不同条目,因此它们可能具有不同的文件偏移量。write由于文件偏移量不同,是否会出现竞争条件?内核又是如何避免这种情况的呢?
书籍:Linux 编程接口;页码 95;第 5 章(文件 I/O:更多详细信息);第 5.4 节