Получение информации монтирования
#include <sys/dcmd_blk.h>#define DCMD_FSYS_MOUNTED_ON __DIOF( _DCMD_FSYS, 16, char[256] )#define DCMD_FSYS_MOUNTED_AT __DIOF( _DCMD_FSYS, 17, char[256] )#define DCMD_FSYS_MOUNTED_BY __DIOF( _DCMD_FSYS, 18, char[256] )
DCMD_FSYS_MOUNTED_AT
, DCMD_FSYS_MOUNTED_BY
или DCMD_FSYS_MOUNTED_ON
.NULL
.Команда используется в сочетании с вызовом devctl(), а все перечисленные аргументы являются его типовыми параметрами. Данные команды позволяют получить символьные строки, характеризующие отношение файловой системы, ассоциированной с filedes, с другими файловыми системами:
Отсутствуют.
Ассоциированный с командой путь.
Функция devctl() может вернуть дополнительный код ошибки, относительно описанных на странице функции:
Рассмотрим раздел файловой системы /dev/hd0t79
, находящийся на устройстве /dev/hd0
, смонтированный в каталог /
и имеющий директорию /tmp
. Рассмотрим применение различных команд к этим путям:
Команда | /dev/hd0t79 | / | /tmp |
---|---|---|---|
DCMD_FSYS_MOUNTED_ON | /dev/hd0 | /dev/hd0t79 | /dev/hd0t79 |
DCMD_FSYS_MOUNTED_BY | / | ||
DCMD_FSYS_MOUNTED_AT | /dev/hd0t79 | / | / |
Ошибка ENODEV
может быть возвращена, например, в следующих случаях:
DCMD_FSYS_MOUNTED_ON
к /dev/hd0
DCMD_FSYS_MOUNTED_BY
к /
Команда DCMD_FSYS_MOUNTED_ON
используется утилитой mount для получения точек монтирования. Рассмотрим упрощенный код, иллюстрирующий её логику работы. Менеджер процессов создаёт и обслуживает префикс /proc/mount, обходя которую можно получить перечень актуальных точек монтирования:
#include <string.h>#include <nbutil.h>#include <dirent.h>#include <sys/ftype.h>#include <sys/dcmd_blk.h>void scan( char *path, size_t pathsize, int size ){DIR *dp;struct dirent *dent;size_t len = strlen( path );if ( !(dp = opendir( path )) )return;while ( (dent = readdir( dp )) ){int ret, nd, pid, chid, handle;size_t ftype;char on[PATH_MAX],ft[16];struct stat st;if ( (strcmp( dent->d_name, "." ) == 0) || (strcmp( dent->d_name, ".." ) == 0) ||(len + strlen( dent->d_name ) + 1 > pathsize /* path too long */) )continue;ret = sscanf( dent->d_name, "%d,%d,%d,%d,%zu", &nd, &pid, &chid, &handle, &ftype );ft[0] = on[0] = '\0';path[len] = '/';strcpy( &path[len + 1], dent->d_name );memset( &st, 0, sizeof( st ) );if ( (stat( path, &st ) == -1) || (ftype == _FTYPE_MOUNT) || (ret != 5) ){if ( (ret != 5) && (S_ISDIR( st.st_mode )) )scan( path, pathsize, size );continue;}if ( S_ISDIR( st.st_mode ) && ftype == _FTYPE_ANY ){struct statvfs stvfs;int fd;if ( (fd = open( path, O_RDONLY )) == -1 )continue;else {devctl( fd, DCMD_FSYS_MOUNTED_ON, on, PATH_MAX, 0 );ret = fstatvfs( fd, &stvfs );close( fd );if ( ret == -1 )continue;strcpy( ft, stvfs.f_basetype );}} elsecontinue;path[len] = '\0';printf( "%12s ", (*(path + size) == '\0') ? "/" : path + size );if ( ft[0] )printf( "%10s ", ft );elseprintf( "%10zu ", ftype );printf( "%s\n", (on[0]) ? on : "none" );}}void main(){char buffer[PATH_MAX];strcpy( buffer, "/proc/mount" );printf( "%12s %10s %s\n", "Mount point", "FS type", "Device" );scan( buffer, PATH_MAX, strlen( buffer ) );}
Результат работы этого кода будет иметь следующий вид:
Mount point FS type Device / qnx6 /net/EA3af59d.net.intra/dev/hd0t177 /tmp qnx4 /net/EA3af59d.net.intra/dev/ram0
Предыдущий раздел: перейти