在Linux shell中,用户可以通过设备文件作为接口来访问设备驱动程序。
当Linux C程序员想要访问他的C程序中的驱动程序时,他是否也通过其设备文件作为接口来访问驱动程序?
换句话说,设备文件是否仅在 shell 中是设备驱动程序的接口,而不是在 C 程序中,或者两者兼而有之?
答案1
AFAIK 设备文件是用户态进程访问设备的唯一选择。内核并不关心该进程是否是 shell。
C 程序有一个用于微调设备访问的选项:调用ioctl
:
man 2 ioctl
:
int ioctl(int d, unsigned long request, ...);
也许有一个外壳包装器,但我不知道有什么。
> strace fdisk -l /dev/sda
[...]
open("/dev/sda", O_RDONLY|O_CLOEXEC) = 3
[...]
ioctl(3, BLKGETSIZE64, 500107862016) = 0
[...]
ioctl(3, CDROM_GET_CAPABILITY or SNDRV_SEQ_IOCTL_UNSUBSCRIBE_PORT, 0) = -1 ENOTTY (Inappropriate ioctl for device)
ioctl(3, BLKALIGNOFF, 0) = 0
ioctl(3, BLKIOMIN, 4096) = 0
ioctl(3, BLKIOOPT, 0) = 0
ioctl(3, BLKPBSZGET, 4096) = 0
ioctl(3, BLKSSZGET, 512) = 0
ioctl(3, BLKSSZGET, 512) = 0
uname({sys="Linux", node="inno", ...}) = 0
ioctl(3, BLKGETSIZE64, 500107862016) = 0
ioctl(3, HDIO_GETGEO, {heads=255, sectors=63, cylinders=60801, start=0}) = 0