프로그래머는 프로그램에서 장치 파일을 장치 드라이버에 대한 인터페이스로 사용합니까?

프로그래머는 프로그램에서 장치 파일을 장치 드라이버에 대한 인터페이스로 사용합니까?

Linux 셸에서 사용자는 장치 파일을 인터페이스로 통해 장치 드라이버에 액세스할 수 있습니다.

Linux C 프로그래머가 C 프로그램의 드라이버에 액세스하려고 할 때 장치 파일을 인터페이스로 통해 드라이버에도 액세스합니까?

즉, 장치 파일은 C 프로그램이 아닌 셸에서만 장치 드라이버에 대한 인터페이스입니까, 아니면 둘 다입니까?

답변1

AFAIK 장치 파일은 사용자 프로세스가 장치에 액세스하는 유일한 옵션입니다. 커널은 프로세스가 쉘인지 여부를 신경 쓰지 않습니다.

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

관련 정보