2010-10-05 2 views
9

Für meine OS-Klasse soll ich die Linux-Katze nur mit Systemaufrufen (kein printf) implementierenWie kann ich den Systemaufruf write() auf den Bildschirm drucken lassen?

Lesen this reference Ich fand es verwendet, um in eine Datei zu drucken. Ich schätze, ich sollte Ofstream manipulieren.

Im Beispiel erscheint: ofstream outfile ("new.txt",ofstream::binary);

Wie kann ich es auf dem Bildschirm schreiben zu machen?

EDIT: Ich erkannte, dass write() Teil der Iostream-Bibliothek ist, ist das das gleiche wie das Int schreiben (int fd, char * buf, int Größe) Systemaufruf?

+1

Und vergessen Sie nicht, dass Linux Katze ist GNU Katze und Sport 11 nicht ignoriert Befehlszeilenoptionen; -) .http: //linux.die.net/man/1/cat –

+0

Sie ' Sie haben dies als 'C' getaggt, aber Sie sprechen über und haben mit' C++ 'Klassen verbunden. Soll das C oder C++ sein? Re Ihre Bearbeitung - ich würde nicht Iostream zu sein, erlaubt "nur Systemaufrufe", nur Dinge wie "Mann 2 schreiben" –

Antwort

7

Schreiben Sie in den Dateideskriptor für Standardausgabe oder Standardfehler (1 bzw. 2).

3
#include <unistd.h> 
/* ... */ 
const char msg[] = "Hello world"; 
write(STDOUT_FILENO, msg, sizeof(msg) - 1); 

erste Argument ist der Dateideskriptor für STDOUT (normalerweise 1), die zweite der Puffer aus zu schreiben, ist, die dritte ist die Größe des Textes in dem Puffer (-1 nicht Null Terminator drucken).

19

Ein Systemaufruf ist ein vom Linux-Kernel bereitgestellter Dienst. In der C-Programmierung sind Funktionen in libc definiert, die einen Wrapper für viele Systemaufrufe bereitstellen. Der Funktionsaufruf write() ist einer dieser Systemaufrufe.

Das erste an write() übergebene Argument ist der Dateideskriptor, in den geschrieben werden soll. Die symbolischen Konstanten STDERR_FILENO, STDIN_FILENO und STDOUT_FILENO sind jeweils definiert , und in unidtd.h. Sie möchten entweder STDOUT_FILENO oder STDERR_FILENO schreiben.

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

Sie können alternativ die syscall() Funktion verwenden, um einen indirrect Systemaufruf durchzuführen, indem die Funktionsnummer in syscall.h oder unistd.h definiert angibt. Mit dieser Methode können Sie sicherstellen, dass Sie nur Systemaufrufe verwenden. Sie finden The Linux System Call Quick Refernence (PDF Link) als hilfreich.

/* 4 is the system call number for write() */ 
const char msg[] = "Hello World!"; 
syscall(4, STDOUT_FILENO, msg, sizeof(msg)-1);
+0

Seltsam, aber 'syscall (4 ...)' nicht für mich arbeiten, aber ' syscall (1, 0, "12345 \ n", 6); 'hat funktioniert. – exebook

+0

@exebook 4 ist für Mac, 1 ist für Linux – Vad

+0

Link zu syscall Referenz PDF gebrochen. Ein unvollkommener Ersatz könnte sein: https://syscalls.kernelgrok.com/ –

Verwandte Themen