- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我浏览了 K&R C,我注意到为了读取目录中的条目,他们使用了:
while (read(dp->fd, (char *) &dirbuf, sizeof(dirbuf)) == sizeof(dirbuf))
/* code */
dirbuf
是特定于系统的目录结构,而
dp->fd
一个有效的文件描述符。在我的系统上,
dirbuf
本来是
struct linux_dirent
.请注意,一个
struct linux_dirent
条目名称有一个灵活的数组成员,但为了简单起见,让我们假设它没有。 (在这种情况下处理灵活的数组成员只需要一些额外的样板代码)。
read()
尝试读取上述目录条目,
read()
返回
-1
和
errno
设置为
EISDIR
.
getdents()
系统调用。但是,我注意到它的工作方式与上面几乎相同。
while (syscall(SYS_getdents, fd, &dirbuf, sizeof(dirbuf)) != -1)
/* code */
read()
相比似乎没有什么好处。正如在 K&R 中所做的那样。
最佳答案
getdents
将返回 struct linux_dirent
.它将为任何基础类型的文件系统执行此操作。 “on disk”格式可能完全不同,只有给定的文件系统驱动程序知道,所以简单的用户空间读取调用是行不通的。即,getdents
可以从 native 格式转换为填充 linux_dirent
.
couldn't the same thing be said about reading bytes from a file with read()? The on disk format of the data within a file isn't necessary uniform across filesystems or even contiguous on disk - thus, reading a series of bytes from disk would again be something I expect to be delegated to the file system driver.
open/close/read/write/seek
),表中有相应的条目。
I assume that the FS driver would know about the location of the data inside a regular file on disk - even if the data was fragmented.
getdents
返回。这“位于”inode 索引层之上。
static part|variable length name
static part|variable length name
...
<static1>,<static2>...
<variable1>,<variable2>,...
read(2)
可能会自动读取类型 A 组织。调用,B 型将有困难。所以,
getdents
VFS 调用处理这个。
couldn't the VFS also present a "linux_dirent" view of a directory like the VFS presents a "flat view" of a file?
getdents
是为了。
Then again, I'm assuming that a FS driver knows the type of each file and thus could return a linux_dirent when read() is called on a directory rather than a series of bytes.
getdents
并不总是存在。当目录是固定大小并且只有一种 FS 格式时,
readdir(3)
电话大概做了
read(2)
在下面并得到一系列字节 [这只是
read(2)
提供]。其实IIRC,一开始只有
readdir(2)
和
getdents
和
readdir(3)
不存在。
read(2)
,你会怎么做? “短”(例如两个字节太小)?您如何将其传达给应用程序?
My question is more like since the FS driver can determine whether a file is a directory or a regular file (and I'm assuming it can), and since it has to intercept all read() calls eventually, why isn't read() on a directory implemented as reading the linux_dirent?
read
目录上的 未截获并转换为
getdents
因为操作系统是极简主义的。它希望您了解差异并进行适当的系统调用。
open(2)
对于文件或目录 [
opendir(3)
是包装器并且做
open(2)
下]。您可以读/写/查找文件,查找/获取目录。
read
退货
EISDIR
. [旁注:我在最初的评论中忘记了这一点]。在它提供的简单“平面数据”模型中,没有办法传达/控制所有这些
getdents
可以/可以。
getdents
获取部分/错误信息,而不是允许以低劣的方式获取部分/错误信息。界面。
getdents
以原子方式做事。如果您正在读取给定程序中的目录条目,则可能有其他程序正在创建和删除该目录中的文件或重命名它们——就在您的
getdents
的中间。序列。
getdents
将呈现原 subview 。文件存在或不存在。它已被重命名或尚未重命名。因此,无论您周围发生了多少“动荡”,您都不会获得“半修改”的观点。当你问
getdents
对于 20 个条目,您会得到它们 [如果只有那么多,则为 10 个]。
getdents
您需要 50,000 个条目 [您必须提供空间]。你通常会得到大约 100 左右的东西。但是,现在,您拥有的是完整目录的及时原子快照。我有时会这样做,而不是循环计数 1--YMMV。您仍然必须防止立即消失,但至少您可以看到它(即后续文件打开失败)
getdents
发生时它就在那里。 .另一个进程可能会立即删除它,但不会在
getdents
中间
read(2)
如果允许,您必须猜测要读取多少数据,并且不知道哪些条目是在部分状态下完全形成的。如果 FS 具有上述 B 型组织,则单次读取无法在单个步骤中原子地获取静态部分和可变部分。
read(2)
做什么
getdents
做。
getdents
,
unlink
,
creat
,
rmdir
, 和
rename
(等)操作是互锁和序列化的,以防止任何不一致[更不用说 FS 损坏或泄漏/丢失 FS 块]。换句话说,这些系统调用都“相互了解”。
getdents
获取整个 View (无论是“x y”、“y z”、“x z”还是“z”),但它永远不会同时看到“x y z”。
关于c - 为什么 Linux 在目录上使用 getdents() 而不是 read()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36144807/
我有一个阅读器,其中包含有关 51*51 网格的信息,其中网格上的每个点都由 f32 表示。 .我想将这些数据读入一个向量,以便我可以轻松处理它: pub fn from_reader(reader:
我重新启动了 SQL Server 2005 并运行了统计 IO 的查询。 我得到了这些结果:表“xxx”。扫描计数 1,逻辑读取 789,物理读取 3,预读读取 794,... 预读读取数是读取并放
在 CLHS 中,我为 :read-only x 读到:“当 x 为真时,这指定不能更改此插槽;它将始终包含构造时提供的值。” 我可以做到这一点(CCL、SBCL): CL-USER> (defstr
让我们考虑一下这句话(Total Store Ordering): reads are ordered before reads, writes before writes, and reads be
我正在开发一个 SMTP 库,它使用缓冲读取器通过网络读取行。 我想要一种安全的方式来从网络读取数据,而不依赖于 Rust 内部机制来确保代码按预期工作。具体来说,我想知道 Read trait 是否
我不清楚所有这些读取字符串函数之间的关系。嗯,很明显clojure.core/read-string可以读取 pr[n] 输出的任何序列化字符串甚至 print-dup .也很清楚clojure.ed
所以我做了这个功能,就像倒计时一样。我想在倒计时减少时读取命令。我的大问题是让 read() 在倒计时减少时等待输入。如您所见,我尝试使用 select() 但在第一个 printf 之后("time
这是我vue3+echart5 遇到的报错:Cannot read properties of undefined (reading ‘type‘) 这个问题需要搞清楚两个关键方法: toRaw: 作
下图中,左边是C代码,右边是未优化的LLVM IR形式。 The Figure 在 IR 上运行 MemoryDependenceAnalysis 可查找内存依赖性。原始代码及其 IR 等效代码中
这个问题在这里已经有了答案: Read values into a shell variable from a pipe (17 个答案) 关闭 3 年前。 我一直在尝试像这样从程序输出中读取环境变
当我输入相同的整数时,如何将整数转换为与使用 read(0,buff,nbytes) 获得的缓冲区相同的值/编码字符?我正在尝试编写类似 read() 的东西,但用整数数据代替读取到缓冲区的文件描述符
This question already has answers here: Closed 2 years ago. Read input in bash inside a while loop (
我正在尝试处理来自 MySQL 数据库的一些数据(主要是 double 值)。我收到此错误消息: Invalid attempt to access a field before calling Re
我正在制作一个简单的 TCP/IP 套接字应用 这样做有什么不同: DataInputStream in = new DataInputStream(clientSocket.getInputStre
我操作API服务器。 手机APP访问API服务器时,有时会出现该异常。 我尝试在测试服务器上进行测试,但无法重现。(我改变了apache和tomcat的连接时间。) 有什么问题?? 我该如何解决这个问
我在段落末尾使用“阅读更多”只是为了提醒像P.T.O一样的用户 为什么会有问题? 最佳答案 您必须明白,许多屏幕阅读器用户不会等到整个页面都读给他们听。他们使用键盘快捷键在页面中导航。 JAWS(可以
我已将我的 Angular 应用程序从 12 版本升级到 13 版本。我在单元测试运行期间开始遇到此错误。 Chrome Headless 94.0.4606.61 (Windows 10) AppC
我正在尝试为以下组件编写一个。我正在使用 queryParams 然后使用 switchmap 来调用服务。这是 url 的样子: http://localhost:4200/test-fee/det
我的代码有什么问题? Uncaught TypeError: Cannot read properties of undefined (reading 'remove') 和 Uncaught Typ
我在我的 React 应用程序中遇到了这个问题。 类型错误:无法读取未定义的属性(读取“requestContent”) 我在我的应用程序中使用 commercejs。代码指向 isEmpty=!ca
我是一名优秀的程序员,十分优秀!