كيف يمكنني اكتشافه عند تثبيت الدليل مع Inotify؟

StackOverflow https://stackoverflow.com/questions/1113176

  •  12-09-2019
  •  | 
  •  

سؤال

أنا أستخدم Linux Inotify للكشف عن أحداث FS على برنامجي.

كيف يمكنني إخطاري عند تركيب جهاز على دليل مراقب؟

هل كانت مفيدة؟

المحلول

لا أعتقد أنك تستطيع أن تفعل ذلك inotify. وبعد هنا هي الطريقة على الرغم من:

  1. اقرأ uevents من kernel. عبر أ Netlink. المقبس وتصفية تلك أين "ACTION" ليس "mount".
  2. قراءة وتحليل "/proc/mounts" عندما تحصل على حدث مع "mount" عمل.
  3. ابحث عن سجل للحصول على نقطة جبل مع الجهاز الذي تم تركيبه للتو وتصفيةه إذا لم يكن الدليل الذي تشاهده.

نصائح أخرى

تعديل: تحديث ليكون أقل من 5 سنوات عفا عليها الزمن

إذا كنت على أي شيء، إلا أن أكثر الأنظمة قديمة، libudev. هو ما تريده للخطوة الأولى.

إذا كنت على شيء من هذا العقد، uDisks. سوف تفعل كل هذا بالنسبة لك، أيضا. كنت بحاجة لمشاهدة org.freedesktop.dbus.objectmanager. واجهة على / ORG / Freedesktop / Udisks2 لمعرفة متى الجديد نظام الملفات در.

على أنظمة Linux الحديثة / ETC / MTAB غالبا ما يشير إلى / بروك / تصاعد / يتصاعد:

$ ls -l /etc/mtab lrwxrwxrwx 1 root root 12 Sep 5 2013 /etc/mtab -> /proc/mounts $ ls -l /proc/mounts lrwxrwxrwx 1 root root 11 Jul 10 14:56 /proc/mounts -> self/mounts

بروك (5) انعظم يقول أنك لا تحتاج حقا إلى استخدام Inotify لهذا الملف، فهو Pillable:

منذ إصدار Kernel 2.6.15، هذا الملف محور: بعد فتح الملف للقراءة، تغيير في هذا الملف (أي، جبل نظام الملفات أو إلغاء تحميله) يؤدي تحديد (2) لتمييز واصف الملف كقراءة، واستطلاع (2 ) و epoll_wait (2) قم بتمييز الملف بأنه شرط خطأ.

تساءلت لماذا لا يعمل لا يعمل على / وما إلى ذلك / MTAB ووجد هذا manpage.

إذا كنت لا تمانع الكثير من الإنذارات الخاطئة، قد تكون قادرة على مشاهدة ل close_nowrite على /etc/fstab. وبعد وبعد مشاهدة /etc/mtab, /proc/mounts, وما إلى ذلك لا يعمل بالنسبة لي.

يخبرك Inotify فقط عن إلغاء الحمل، ولم تعد Uevents تخبرك عن جبل / إلغاء تحميله.

الطريقة التي يجب القيام بها هي الاستطلاع على / بروك / يتصاعد، وقراءة في المحتويات، وتتبع التصاعد التي رأيتها، ثم تميل عند استيقاظ الاستطلاع. سوف يستيقظ الاستطلاع على ERR / PRI عند تثبيت أي نظام ملفات أو غير مرغوب فيه.

#include <fcntl.h>
#include <errno.h>
#include <poll.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
    int fd;
    struct pollfd ev;
    int ret;
    ssize_t bytesread;
    char buf[8192];

    fd = open("/proc/mounts", O_RDONLY);
    printf("########################################\n");
    while ((bytesread = read(fd, buf, sizeof(buf))) > 0)
        write(1, buf, bytesread);

    do {

        ev.events = POLLERR | POLLPRI;
        ev.fd = fd;
        ev.revents = 0;
        ret = poll(&ev, 1, -1);
        lseek(fd, 0, SEEK_SET);
        if (ev.revents & POLLERR) {
            printf("########################################\n");
            while ((bytesread = read(fd, buf, sizeof(buf))) > 0)
                write(1, buf, bytesread);
        }
    } while (ret >= 0);
    close(fd);

    return 0;
}

يطبع الكود أعلاه فقط نقاط الجبل عند بدء التشغيل، ثم على أي جبل / إلغاء تحميله. الأمر متروك لك إلى "فرق" لهم لمعرفة ما تم إضافته / إزالته.

ملاحظة، كانت كل هذه التقنيات غير مستقرة و / أو مكسورة في إصدارات Linux السابقة. أصبح كل ذلك مستقر في نهاية لينكس 2.6.35 (أو ربما سابقا قليلا).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top