gpt4 book ai didi

linux - os.read 在 inotify 文件描述符 : reading 32 bytes works but 31 raises an exception 上

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:38 25 4
gpt4 key购买 nike

我正在编写一个应该使用 inotify 响应文件更改的程序。下面的框架程序按我的预期工作......

# test.py
import asyncio
import ctypes
import os

IN_CLOSE_WRITE = 0x00000008

async def main(loop):
libc = ctypes.cdll.LoadLibrary('libc.so.6')
fd = libc.inotify_init()

os.mkdir('directory-to-watch')
wd = libc.inotify_add_watch(fd, 'directory-to-watch'.encode('utf-8'), IN_CLOSE_WRITE)
loop.add_reader(fd, handle, fd)

with open(f'directory-to-watch/file', 'wb') as file:
pass

def handle(fd):
event_bytes = os.read(fd, 32)
print(event_bytes)

loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))

...因为它输出...

b'\x01\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00file\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

但是,如果我将其更改为尝试读取 31 个字节...

event_bytes = os.read(fd, 31)

...然后它引发异常...

Traceback (most recent call last):
File "/usr/lib/python3.7/asyncio/events.py", line 88, in _run
self._context.run(self._callback, *self._args)
File "/t.py", line 19, in handle
event_bytes = os.read(fd, 31)
OSError: [Errno 22] Invalid argument

...同样适用于我尝试过的所有小于 31 的数字,包括 1 个字节。

这是为什么?我原以为它应该能够尝试读取任意数量的字节,并且只返回缓冲区中的任何内容,直到 os.read 的第二个参数给定的长度。


我在 Mac OS 的 docker 容器中的 Alpine linux 3.10 中使用非常基本的 Dockerfile 运行它:

FROM alpine:3.10
RUN apk add --no-cache python3
COPY test.py /

并运行它

docker build . -t test && docker run -it --rm test python3 /test.py

最佳答案

这是因为它被写入只允许可以返回有关下一个事件的信息的读取。来自 http://man7.org/linux/man-pages/man7/inotify.7.html

The behavior when the buffer given to read(2) is too small to return information about the next event depends on the kernel version: in kernels before 2.6.21, read(2) returns 0; since kernel 2.6.21, read(2) fails with the error EINVAL.

来自https://github.com/torvalds/linux/blob/f1a3b43cc1f50c6ee5ba582f2025db3dea891208/include/uapi/asm-generic/errno-base.h#L26

#define EINVAL      22  /* Invalid argument */

它大概映射到 Python OSErrorErrno 22

关于linux - os.read 在 inotify 文件描述符 : reading 32 bytes works but 31 raises an exception 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57132701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com