2013-11-08 3 views
4

Как ребята из Linux делают файлы /dev. Вы можете писать им, и они сразу же стираются. я могу себе представить какую-то программу, которая постоянно читать некоторые Dev файл:Как работают файлы dev?

FILE *fp; 
char buffer[255]; 
int result; 
fp = fopen(fileName, "r"); 
if (!fp) { 
    printf("Open file error"); 
    return; 
} 
while (1) 
{ 

    result = fscanf(fp, "%254c", buffer); 
    printf("%s", buffer); 
    memset(buffer, 0, 255); 
    fflush(stdout); 
    sleep(1); 
} 
fclose(fp); 

Но как удалить содержимое там? Закрытие файла и открытие их еще раз в режиме «w» - это не так, как это было сделано, потому что вы можете это сделать, потому что вы можете это сделать, потому что вы можете это сделать, потому что вы можете делать то, что вы можете сделать, например, cat > /dev/tty

ответ

7

Что такое файлы? Файлы - это имена в структуре каталогов, которые обозначают объекты. Когда вы открываете файл, например /home/joe/foo.txt, операционная система создает объект в памяти, представляющий этот файл (или находит существующий, если файл уже открыт) связывает дескриптор с ним, который возвращается, а затем выполняет операции над этим файловым дескриптором (например read и write) направляются через объект в код файловой системы, который управляет представлением файла на диске.

Элементы устройства также являются именами в структуре каталогов. Когда вы открываете /dev/foo, операционная система создает объект в памяти, представляющий устройство, или находит существующий (в этом случае может возникнуть ошибка, если устройство не поддерживает множественные открытия!). В случае успеха он связывает новый файловый дескриптор с устройством obejct и возвращает этот дескриптор в вашу программу. Объект сконфигурирован таким образом, что операции, подобные read и write на дескрипторе, направлены на вызов в конкретный драйвер устройства для устройства foo и соответствуют выполнению каких-либо операций ввода-вывода с этим устройством.

Такие записи в /dev/ не являются файлами; лучшим названием для них является «узлы устройства» (оправданием для которого является имя команды mknod). Только когда программисты и системные администраторы говорят очень слабо, они называют их «файлами устройств».

Когда вы делаете cat > /dev/tty, нет ничего, что «стирает» данные «на другом конце». Ну, не совсем.В принципе, cat вызывает write в дескрипторе, и это приводит к цепочке вызовов функций, которая заканчивается где-то в подсистеме tty ядра. Данные передаются на драйвер tty, который отправляет данные в последовательный порт или сокет или в консольное устройство, которое рисует символы на экране или что угодно. Виртуальные терминалы, такие как xterm, используют пару устройств: master и slave псевдо-tty. Если tty подключен к устройству псевдо-tty, то записи cat > /dev/tty проходят через своего рода «тромбон»: они пузырятся на главной стороне псевдо-tty, где на самом деле есть петля while (1) в некотором пользовательском пространстве C, получая байты, как из трубы. Эта программа - xterm (или что-то еще); он удаляет данные и рисует символы в окне, прокручивает окно и т.д.

3

Unix предназначен для доступа к устройствам (tty, printer и т. Д.), Как и все остальное (как файл), поэтому файлы в/dev являются специальными псевдо-файлами, которые представляют устройство в файловой системе.

Вы не хотите удалять содержимое такого файла устройства, и, честно говоря, это может быть опасно для вашей системы, если вы напишите им волей-неволей, не понимая, что именно вы делаете.

2

Файлы устройств не являются нормальными файлами, если «обычный файл» относится к произвольной последовательности байтов, часто сохраняемой на носителе. Но не все файлы являются нормальными файлами.

В более широком смысле, файлы абстракции со ссылкой на обслуживание системы и/или ресурса, сервис является то, что вы можете отправить информацию для некоторых целей (например, для обычного файла, записи данных в хранилище) и ресурс - это то, о чем вы запрашиваете данные для какой-либо цели (например, для обычного файла, чтения данных из хранилища). C определяет стандарт для взаимодействия с таким сервисом/ресурсом.

Файлы устройств соответствуют этому определению, но они не обязательно соответствуют моим более конкретным примерам обычного чтения и записи в хранилище и из хранилища. Вы можете напрямую создавать файлы dev, но единственная значимая причина для этого - в контексте модуля ядра. Чаще всего вы можете обратиться к ним (например, с udev), имея в виду, что они фактически созданы ядром и представляют собой интерфейс с ядром. Кроме того, функционирование интерфейса отличается от файла dev к файлу dev.

Смежные вопросы