LINUX.ORG.RU

mount & c++


0

0

Прогу пишу на c++, в переменной char имеется путь к устройству (/dev/cdrom) например.

Как определить примонтирован ли он?

Пытался через popen прописать "mount" и в цикле прочитать первое слово каждой строки.
Если будет /dev/cdrom значит примантирован, но что-то я глючу, не как выделить его не могу.
anonymous

Ответ на: комментарий от int19h

Точти то что я делал.

Но мне нужно выделить первое слово, то есть все символы до первого пробела.

Все функции поиска подстрок и символов возвращают указатель на символ.
Как мне с помощью него выразить индекс символа?

anonymous
()
Ответ на: комментарий от int19h

Кстати переодически наблюдаю глюки с mount (kernel 2.4.27), типа делаешь mount / -o remount,ro потом делаешь mount а он показывает что примонтировано как rw (хотя в read-only переводит).

anonymuoz
()
Ответ на: комментарий от anonymous

>Как мне с помощью него выразить индекс символа?

Почитать книжку по С.

anonymuoz
()
Ответ на: комментарий от int19h

Над ним даже есть функции вроде getmntent.

Только надо быть аккуратным с проверкой соответствия устройства - через dev_t, а не имя устройства. IMHO.

Murr ★★
()

или прочитать /etc/mtab или /proc/mounts, можно c fstream

CKulT
()

имхо, в данном случае проще использовать statfs()

Novel ★★★★
()

int is_mounted(const char *dev)
  {
  setenv("dev", dev, 1);
  return !system("grep $dev /etc/mtab >/dev/null");
  }

nobody ★★
()
Ответ на: комментарий от anonymuoz

Это не глюк. Сам подумай: cначала FS перемонтируется в ro, после чего mount уже не может изменить /etc/mtab (он лежит уже на read-only file system), поэтому там остается запись про rw.

nobody ★★
()

> Прогу пишу на c++, в переменной char имеется путь к устройству
> (/dev/cdrom) например.
> Как определить примонтирован ли он?

    std::ifstream ifstr;
    std::string s, s1;

    ifstr.open("/etc/mtab");

    while (getline(ifstr, s)) {
        std::istringstream istr(s);
        istr >> s1;

        if (s1 == "/dev/cdrom") {
            std::cout << "Ура! `" << s1 << "' найден!\n";
            break;
        }
    }

murla
()
Ответ на: комментарий от nobody

>Это не глюк. Сам подумай: cначала FS перемонтируется в ro, после чего >mount уже не может изменить /etc/mtab (он лежит уже на read-only file >system), поэтому там остается запись про rw.
Имхо /etc/mtab нужно в /proc переместить

anonymous
()
Ответ на: комментарий от murla

> if (s1 == "/dev/cdrom") {

Ну а если будет смонтирован /dev/hdc, на который указывает /dev/cdrom.
Или /dev/scsi/host..., на который указывает /dev/sda1?

Murr ★★
()
Ответ на: комментарий от Murr

> Ну а если будет смонтирован /dev/hdc, на который указывает /dev/cdrom.
Или /dev/scsi/host..., на который указывает /dev/sda1?

Потому что это ламерский подход.

Делаем

struct statfs s;

(statfs(path, &s) == -1) {
/* fs не подмонтирована */
} else {
/*
* делаем то что нам надо. для параноиков
* можно проверить s.f_fstypename на то, что
* это действительно cdrom
*/
}

Novel ★★★★
()
Ответ на: комментарий от Novel

Для statfs нужно знать точку монтирования.

Правильный (и довольно переносимый) подход - это getmntent и stat на оба имени устройства (заданное и перечисленное в структуре mntent).

Murr ★★
()
Ответ на: комментарий от Murr

> Для statfs нужно знать точку монтирования.

В условии задачи нам дан путь к устройству, нужно проверить, подмонитировано оно или нет.

Novel ★★★★
()
Ответ на: комментарий от Novel

novel:

statfs дает информацию по файловой системе, на которой лежит файл, заданный параметром. В твоем случае это всегда будет файловая система под /dev.

Murr ★★
()
Ответ на: комментарий от Novel

Novel:

Не вопрос.:) Насчет "переносимости" getmntent ты прав - между разными Unix она никак не переносима, но при изменениях в интерфейсе /proc/mounts или /etc/mtab getmntent может продолжить нормально работать (если разработчики glibc не протормозят).

Murr ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.