Как заставить системный вызов write () печатать на экран? - PullRequest
13 голосов
/ 05 октября 2010

Для моего класса ОС я должен реализовать Linux cat, используя только системные вызовы (без printf)

Чтение эта ссылка Я обнаружил, что она используется для печати в файл. Я думаю, что я должен манипулировать ofstream.

В примере появляется: ofstream outfile ("new.txt",ofstream::binary);

Как я могу заставить его писать на экран?

РЕДАКТИРОВАТЬ: я понял, что write () является частью библиотеки iostream, это то же самое, что системный вызов int write (int fd, char * buf, int size)?

Ответы [ 5 ]

24 голосов
/ 05 октября 2010

Системный вызов - это сервис, предоставляемый ядром Linux. В программировании на C функции определены в libc, которые предоставляют оболочку для многих системных вызовов. Вызов функции write() является одним из этих системных вызовов.

Первый аргумент, переданный write(), - это дескриптор файла для записи. Символические константы STDERR_FILENO, STDIN_FILENO и STDOUT_FILENO соответственно определены как 2 , 0 и 1 в unidtd.h . Вы хотите написать в STDOUT_FILENO или STDERR_FILENO .

const char msg[] = "Hello World!";
write(STDOUT_FILENO, msg, sizeof(msg)-1);

Вы также можете использовать функцию syscall() для выполнения косвенного системного вызова, указав номер функции, определенный в syscall.h или unistd.h, Используя этот метод, вы можете гарантировать, что вы используете только системные вызовы. Вам может пригодиться Краткий справочник по системному вызову Linux (PDF Link).

/* 4 is the system call number for write() */
const char msg[] = "Hello World!";
syscall(4, STDOUT_FILENO, msg, sizeof(msg)-1);
8 голосов
/ 05 октября 2010

Запись в дескриптор файла для стандартного вывода или стандартной ошибки (1 и 2 соответственно).

3 голосов
/ 05 октября 2010
#include <unistd.h>
/* ... */
const char msg[] = "Hello world";
write( STDOUT_FILENO, msg, sizeof( msg ) - 1 );

Первый аргумент - это дескриптор файла для STDOUT (обычно 1), второй - буфер для записи, третий - размер текста в буфере (-1 не должен выводить нулевой терминатор) .

2 голосов
/ 24 мая 2018
#define _GNU_SOURCE         /* See feature_test_macros(7) */    
#include <unistd.h> // For open, close, read, write, fsync
#include <sys/syscall.h>  //For SYSCALL id __NR_xxx

//Method 1 : API    
write(1,"Writing via API\n",\
        strlen("Writing via API\n") ); 
fsync(1);
//Method 2  : Via syscall id
const char msg[] = "Hello World! via Syscall\n";
syscall(__NR_write, STDOUT_FILENO, msg, sizeof(msg)-1);     
syscall(__NR_fsync, STDOUT_FILENO );    // fsync(STDOUT_FILENO);
0 голосов
/ 06 октября 2010

Ваша ссылка неверна.Это часть C ++ и не имеет ничего общего с вашим заданием.Правильный эталон http://www.opengroup.org/onlinepubs/9699919799/functions/write.html

...