gpt4 book ai didi

c - watch 描述符到底是什么? (Linux inotify 子系统)

转载 作者:IT王子 更新时间:2023-10-29 00:41:41 27 4
gpt4 key购买 nike

我目前在我的 C 代码中使用 inotify() 系统来监视文件系统中某些目录的事件。

现在,使用这些东西之一的过程如下。你取一个整数(比如 event_notifier),使用 inotify_init() 将它变成一个 inotify 描述符,就像这样

event_notifier=inotify_init();

现在,假设我想监视多个目录中的事件。然后我将在这些目录上向这个 event_notifier 添加监视

wd1 = inotify_add_watch(event_notifier,"/../path..to..directory1/../",IN_ALL_EVENTS);
wd2 = inotify_add_watch(event_notifier,"/../path..to..directory2/../",IN_ALL_EVENTS);
wd3 = inotify_add_watch(event_notifier,"/../path..to..directory3/../",IN_ALL_EVENTS);
. . . .
wdn = inotify_add_watch(event_notifier,"/../path..to..directoryn/../",IN_ALL_EVENTS);

现在,我可以在多个目录上添加监视。这些调用中的每一个都返回一个“监视描述符”(上面的 wd1、wd2、wd3.. wdn)。每当任何目录中发生事件时,inotify 系统都会向 inotify 文件描述符 event_notifier 发送一个事件以及对应于该特定“监视目录”的监视描述符(wd1、wd2...wdn)

当事件发生时,我可以读取 event_notifier 中的 struct inotify_event 数组。这个 inotify_event 结构有以下字段:

struct inotify_event  
{
int wd; //Watch descriptor
...
uint32_t len; //Size of 'name' field
char name[]; //null terminated name
}

要读取事件,你只需要做

read(event_notifier, buffer, sizeof(buffer))
struct inotify_event* event;
event=(struct inotify_event*)buffer; //Assuming only one event will occur

我想知道通知来自哪个目录。但是当我 stat() watch 描述符时,它什么也没给我

struct stat fileinfo;
fstat(event->wd, &fileinfo);
printf("\n Size of file is %l",fileinfo_st.size);

甚至/proc/self/fd/event->fd 上的 readlink() 也没有产生任何文件名。

char filename[25]; 
readlink("/proc/self/fd/event-wd",filename,sizeof(filename));
printf("\n The filename is %s",filename);

我有两个问题:

1) watch 描述符究竟指向什么? 它有什么好处?
2) 我如何知道通知来自哪个目录

最佳答案

What is the watch descriptor pointing to exactly ? What is it good for ?

监视描述符不是文件系统对象或文件描述符。它是 inotify 子系统用来将事件链接到 watched 资源的资源描述符,并使您可以在删除它们时指定某些 watches。

您还应该注意,可能的“打开”监视描述符的数量在系统上是有限的。您可以使用以下方法获得最大值:

cat  /proc/sys/fs/inotify/max_user_watches

如果您出于任何原因需要超过此值,您可以使用以下方式设置值:

sudo sysctl -w fs.inotify.max_user_watches=XXXXXX

How can I tell which directory the notification is coming from ?

仅使用 inotify 扩展无法从事件结构中获取文件(目录)的完整路径。您的应用程序代码将需要特殊的查找表来存储监视描述符和完整路径名之间的链接。我在 PHP 中做过一次,因为我也觉得我需要它。您可以查看 Github 上的代码.就像我说的,它是 PHP,但它可能有助于理解我在做什么。 (inotify 系统调用签名在 PHP 和 C 中是相同的)

关于c - watch 描述符到底是什么? (Linux inotify 子系统),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24342156/

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