Linux программирование в примерах | страница 94
>open()
.• Системные вызовы >read()
и >write()
соответственно читают и записывают данные. Их интерфейс прост. В частности, они не интерпретируют данные, файлы представлены линейными потоками байтов. Системный вызов >lseek()
осуществляет ввод/выводе произвольным доступом: возможность перемещаться внутри файла.
• Для синхронного ввода/вывода предусмотрены дополнительные флаги для >open()
, при этом данные записываются на физический носитель данных до возвращения >write()
или >read()
. Можно также форсировать запись данных на диск на управляемой основе с помощью >fsync()
или >fdatasync()
.
• Системные вызовы >truncate()
и >ftruncate()
устанавливают абсолютную длину файла. (На более старых системах они могут использоваться лишь для сокращения длины файла; на современных системах они могут также увеличивать файл.)
Упражнения
1. Используя лишь >open()
, >read(),
>write()
и >close()
, напишите простую программу >copy
, которая копирует файл, имя которого дается в первом аргументе, в файл с именем во втором аргументе.
2. Усовершенствуйте программу >copy
так, чтобы она принимала ">-
" в значении «стандартный ввод» при использовании в качестве первого аргумента и в значении «стандартный вывод» в качестве второго аргумента. Правильно ли работает '>copy - -
'?
3. Просмотрите страничку справки для proc(5) на системе GNU/Linux. В частности, посмотрите подраздел >fd
. Выполните '>ls -l /dev/fd
' и непосредственно проверьте файлы в >/proc/self/fd
. Если бы >/dev/stdin
и дружественные устройства были бы в ранних версиях Unix, как это упростило бы код для программы V7 >cat
? (Во многих других современных системах Unix есть каталог или файловая система >/dev/fd
. Если вы не используете GNU/Linux, посмотрите, что вы можете обнаружить в своей версии Unix.)
4. Даже если вы пока этого не понимаете, постарайтесь скопировать сегмент кода из V7 >cat.c
, который использует >struct stat
и функцию >fstat()
, в >ch04-cat.c
, чтобы она также сообщала об ошибке для '>cat file >> file
'.
5. (Простое) Предположив наличие >strerror()
, напишите свою версию >perror()
.
6. Каков результат выполнения '>ulimit -n
' на вашей системе?
7. Напишите простую версию программы >umask
, назвав ее >myumask
, которая принимает в командной строке восьмеричную маску. Используйте >strtol()
с основанием 8 для преобразования строки символов аргумента командной строки в целое значение. Измените >umask
с помощью системного вызова >umask()
.
Откомпилируйте и запустите >myumask
, затем проверьте значение