Jul 19, 2013 14:50
В отличие от многих других операционных систем, в которых для каждого типа устройств разрабатывался свой отдельный API, в юниксе изначально присутствовала концепция "everything is a file". В частности, обращение к драйверам устройств осуществляется через файлообразные объекты, обычно находящиеся в директории /dev. Естественно, устройства бывают разные, и эти различия проявляются в вызовах ioctl(), но и эти вызовы применяются к файловым дескрипторам, получаемым в результате операции open() над теми самыми псевдо-файлами устройств.
Однако, есть одно исключение: сетевые интерфейсы.
Хотя передача данных по сети и управление самими интерфейсами (например, назначение адресов, установка маршрутов, MTU, размеров очередей, и пр.) всё равно осуществляется через файлообразные объекты (сокеты) теми же вызовами read/write/ioctl, но сами сокеты образуются не в результате open("/dev/eth0"), а совершенно отдельным вызовом socket().
Кто-нибудь знает, почему для сетевых устройств было сделано такое исключение?
пятница,
unix