c - major() 和 minor() 给出与 ls 不同的数字
问题描述
我的 C 程序的一部分是输出两个设备文件是否相等(即,相同类型的设备文件和相同的主要和次要编号)。它输出tty
的tty2
是相同的设备文件,而我认为它们不是。
我添加了代码来打印每个文件的检索到的主要和次要编号,它打印出的数字与我执行时得到的数字不同,ls -l /dev/tty
并且ls -l /dev/tty2
. tty
和打印出来的主要和次要数字tty2
是 0 和 6,使用 时ls
,它们分别是 5 和 0tty
以及 4 和 2 tty2
。
我是 Linux 和 C 的新手。我仔细检查了手册页,major()
似乎minor()
我正确使用了这些功能。所以,我不知道出了什么问题。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>
#define report_error(x) puts("error")
#define BUFFER_SIZE 1<<16
int main(int argc, char *argv[])
{
struct stat statbuf1;
struct stat statbuf2;
char *fn1;
char *fn2;
if (argc < 3) {
if (argc < 1) {
report_error("no command line");
} else {
report_error("Not enough arguments");
}
}
fn1 = argv[1];
fn2 = argv[2];
if (lstat(fn1, &statbuf1)) {
report_error(strerror(errno));
}
if (lstat(fn2, &statbuf2)) {
report_error(strerror(errno));
}
if (S_ISCHR(statbuf1.st_mode) && S_ISCHR(statbuf2.st_mode)) {
unsigned int major1 = major(statbuf1.st_dev);
unsigned int major2 = major(statbuf2.st_dev);
unsigned int minor1 = minor(statbuf1.st_dev);
unsigned int minor2 = minor(statbuf2.st_dev);
printf("%d %d\n%d %d\n", major1, major2, minor1, minor2);
if (major1 == major2 && minor1 == minor2) {
printf("the two device files are equal\n");
exit(0);
}
}
return 0;
}
解决方案
st_dev
根据手册页,是包含 file 的设备的ID。换句话说,文件名所在的设备。所以它和你的/dev
目录是一样的,你会看到你是否使用stat
你的shell中的命令。
您对 感兴趣st_rdev
,它是设备 ID(如果是特殊文件)(同样,来自手册页)。
该stat
命令同时显示:
stat /dev/tty /dev/tty1
文件:/dev/tty 大小:0 块:0 IO 块:4096 个字符的特殊文件 设备:6h/6d Inode:1035 链接:1 设备类型:5,0 访问:(0620/crw--w----) Uid:( 0/ root) Gid:( 5/ tty)
……
文件:/dev/tty1 大小:0 块:0 IO 块:4096 个字符的特殊文件 设备:6h/6d Inode:1044 链接:1 设备类型:4,1 访问:(0620/crw--w----) Uid:( 0/ root) Gid:( 5/ tty)
固定代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>
#include <unistd.h>
int get_char_device(const char *name,
unsigned *dev_major, unsigned *dev_minor)
{
struct stat buf;
if (stat(name, &buf)) {
perror(name);
return 1;
}
if (!S_ISCHR(buf.st_mode)) {
fprintf(stderr, "%s: not a char device\n", name);
return 1;
}
*dev_major = major(buf.st_rdev);
*dev_minor = minor(buf.st_rdev);
return 0;
}
int main(void)
{
unsigned int major1, minor1, major2, minor2;
if (get_char_device("/dev/tty1", &major1, &minor1) ||
get_char_device("/dev/tty2", &major2, &minor2)) {
return 1;
}
printf("%d %d\n%d %d\n", major1, major2, minor1, minor2);
if (major1 == major2 && minor1 == minor2) {
puts("the two device files are equal");
return 1;
}
}
推荐阅读
- angular - 即使 queryParams 名称相同,如何合并或添加 queryParams
- html - 文本在 Safari 中的位置与在其他浏览器中的位置不同
- angular5 - 日期管道在 Html 插值中工作正常,但在 Mat-DatePicker 输入字段中不工作
- integration-testing - 不能使用变量测试退出柑橘重复直到语句
- java - JLabels 数组不会显示
- swift - 如何使用 didSet 更新 UIButton 的 .setTitle?
- javascript - 如何在 Javascript 中从没有破折号(-)和冒号(:) 的 ISO 日期字符串中获取日期对象
- javascript - 在 Experss.js + Mongodb 上对对象进行排序的最佳实践
- docker - 无法部署 Dockerfile: path/to/Dockerfile': ADD failed temp/path/to/app :: 没有这样的文件或目录
- vue.js - vue i18n 语言环境未更新