Язык программирования Си


         

При этом, если на диске


- 165 - Си в UNIX

$ a.out > /dev/null &

Еще один пример использования:

$ cp /dev/hd00 /dev/null

Содержимое всего винчестера копируется "в никуда". При этом, если на диске есть сбойные блоки - система выдает на консоль сообщения об ошибках чтения. Так мы можем быстро выяснить, есть ли на диске плохие блоки. /dev/tty

Открытие файла с таким именем в действительности открывает для нас управляющий

терминал, на котором запущена данная программа; даже если ее ввод и вывод были перенаправлены в какие-то другие файлы[**]. Поэтому, если мы хотим выдать сообще- ние, которое должно появиться именно на экране, мы должны поступать так:

#include <stdio.h> void message(char *s){ FILE *fptty = fopen("/dev/tty", "w"); fprintf(fptty, "%s\n", s); fclose (fptty); } main(){ message("Tear down the wall!"); }

Это устройство доступно и для записи (на экран) и для чтения (с клавиатуры).

Файлы устройств нечувствительны к флагу открытия O_TRUNC - он не имеет для них смысла и просто игнорируется. Поэтому невозможно случайно уничтожить файл-устройство (к при- меру /dev/tty) вызовом fd=creat("/dev/tty", 0644); Файлы-устройства создаются вызовом mknod, а уничтожаются обычным unlink-ом. Более подробно про это - в главе "Взаимодействие с UNIX".

4.45. Эмуляция основ библиотеки STDIO, по мотивам 4.2 BSD.

#include <fcntl.h> #define BUFSIZ 512 /* стандартный размер буфера */ #define _NFILE 20 #define EOF (-1) /* признак конца файла */ #define NULL ((char *) 0)

#define IOREAD 0x0001 /* для чтения */ #define IOWRT 0x0002 /* для записи */ #define IORW 0x0004 /* для чтения и записи */ #define IONBF 0x0008 /* не буферизован */ #define IOTTY 0x0010 /* вывод на терминал */ #define IOALLOC 0x0020 /* выделен буфер malloc-ом */ #define IOEOF 0x0040 /* достигнут конец файла */ #define IOERR 0x0080 /* ошибка чтения/записи */

____________________ [*] Заметим еще, что если дескриптор fd связан с терминалом, то можно узнать полное имя этого устройства вызовом стандартной функции

extern char *ttyname(); char *tname = ttyname(fd);

Она выдаст строку, подобную "/dev/tty01". Если fd не связан с терминалом - она вернет



Содержание  Назад  Вперед