Основы программирования в Linux - Страница 46
□ 0 — стандартный ввод;
□ 1 — стандартный вывод;
□ 2 — стандартный поток ошибок.
Вы можете связать с файлами и устройствами другие дескрипторы файлов, используя системный вызов open, который уже обсуждался вкратце. Дескрипторы файлов, открытые автоматически, уже позволяют вам создавать простые программы с помощью вызова
writewrite
Системный вызов
writebufnbytesfildesnbyteswriteerrnoДалее приведена синтаксическая запись.
#include <unistd.h>size_t write(int fildes, const void *buf, size_t nbytes);Благодаря полученным знаниям вы можете написать свою первую программу, simple_write.c:
#include <unistd.h>#include <stdlib.h>int main() { if ((write(1, "Here is some datan", 18)) != 18) write(2, "A write error has occurred on file descriptor 1n", 46); exit(0);}Эта программа просто помещает сообщение в стандартный вывод. Когда она завершается, все открытые дескрипторы файлов автоматически закрываются, и вам не нужно закрывать их явно. Но в случае буферизованного вывода это не так.
$ ./simple_writeHere is some data$И еще одно маленькое замечание: вызов
writeerrnowriteread
Системный вызов
readnbytesfildesbufread#include <unistd.h>size_t read(int fildes, void *buf, size_t nbytes);Программа simple_read.c копирует первые 128 байтов стандартного ввода в стандартный вывод. Она копирует все вводимые данные, если их меньше 128 байтов.
#include <unistd.h>#include <stdlib.h>int main() { char buffer[128]; int nread; nread = read(0, buffer, 128); if (nread == -1) write(2, "A read error has occurredn", 26); if ((write(1, buffer, nread)) != nread) write(2, "A write error has occurredn", 27); exit(0);}Если вы выполните программу, то получите следующий результат:
$ echo hello there | ./simple_readhello there$ ./simple_read < draft1.txtFilesIn this chapter we will be looking at files and directories and how tomanipulate them. We will learn how to create files, $Первое выполнение программы с помощью команды
echoОбратите внимание на то, что знак подсказки или приглашения командной оболочки появляется в конце последней строки вывода, поскольку в этом примере 128 байтов не формируют целое число строк.
open
Для создания дескриптора нового файла вы должны применить системный вызов
open#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>int open(const char *path, int oflags);int open(const char *path, int oflags, mode_t mode);Строго говоря, для использования вызова
openНе вдаваясь в подробности, скажем, что вызов
openreadwrite