写一个linux中判断某个目录已经被挂载到另一个目录上的函数
时间: 2024-04-30 07:20:10 浏览: 170
Linux中挂载windows里共享目录方法
可以使用 `mount` 命令来获取当前系统上已经挂载的文件系统信息。针对某个目录,我们可以获取到它所在的文件系统挂载点,然后递归查找它的父目录,如果在某个父目录下找到了一个已经挂载的目录,那么就可以判断当前目录已经被挂载到另一个目录上了。
以下是一个实现该功能的函数示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mount.h>
#include <limits.h>
int is_mounted(const char *path) {
char *p = realpath(path, NULL);
if (p == NULL) {
perror("realpath");
return -1;
}
char *buf = NULL;
size_t size = 0;
FILE *fp = fopen("/proc/mounts", "r");
if (fp == NULL) {
perror("fopen");
free(p);
return -1;
}
while (getline(&buf, &size, fp) != -1) {
char *dev, *mp, *fs, *opts, *rest;
dev = strtok_r(buf, " ", &rest);
mp = strtok_r(NULL, " ", &rest);
fs = strtok_r(NULL, " ", &rest);
opts = strtok_r(NULL, " ", &rest);
if (strcmp(mp, p) == 0) {
// found mount point for current path
free(buf);
free(p);
fclose(fp);
return 1;
}
if (strstr(p, mp) == p && (p[strlen(mp)] == '\0' || p[strlen(mp)] == '/')) {
// current path is a subdirectory of a mount point
free(buf);
free(p);
fclose(fp);
return 1;
}
}
free(buf);
free(p);
fclose(fp);
return 0;
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <path>\n", argv[0]);
exit(EXIT_FAILURE);
}
int ret = is_mounted(argv[1]);
if (ret == -1) {
exit(EXIT_FAILURE);
} else if (ret == 1) {
printf("%s is mounted\n", argv[1]);
} else {
printf("%s is not mounted\n", argv[1]);
}
exit(EXIT_SUCCESS);
}
```
该函数的实现过程中,先使用 `realpath` 函数将输入的目录路径转换为绝对路径,方便后续比较。然后打开 `/proc/mounts` 文件,逐行读取文件系统挂载信息。对于每一行,使用 `strtok_r` 函数将其分成设备名、挂载点、文件系统类型和挂载选项四个部分,然后分别与当前目录进行比较。如果当前目录就是某个挂载点,或者是某个挂载点的子目录,那么就判断当前目录已经被挂载到另一个目录上了。最后记得释放动态分配的内存,关闭文件指针。
阅读全文