Wie kann ich den Systemaufruf write() auf dem Bildschirm drucken lassen?

Lesezeit: 3 Minuten

Benutzer-Avatar
undundundund

Für meine Betriebssystemklasse soll ich die Katze von Linux nur mit Systemaufrufen implementieren (kein printf)

Lektüre diese Referenz Ich habe festgestellt, dass es zum Drucken in eine Datei verwendet wird. Ich denke, ich sollte ofstream manipulieren.

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

Wie kann ich es auf den Bildschirm schreiben lassen?

EDIT: Mir wurde klar, dass dieses write() Teil der iostream-Bibliothek ist, ist dies dasselbe wie der Systemaufruf int write (int fd, char *buf , int size)?

  • Und vergessen Sie nicht, dass Linux cat GNU cat ist und 11 nicht ignorierte Befehlszeilenoptionen bietet ;-).linux.die.net/man/1/cat

    – Peter g.

    5. Oktober 2010 um 18:00 Uhr

  • Sie haben dies als markiert C aber du redest und hast verlinkt C++ Klassen. Soll das C oder C++ sein? Bezüglich Ihrer Bearbeitung – ich würde iostream nicht als zulässig betrachten, da “nur Systemaufrufe” gegeben sind, nur Dinge wie man 2 write

    – Stefan P

    5. Oktober 2010 um 18:13 Uhr

Benutzer-Avatar
jschmier

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

Das erste übergebene Argument an write() ist der Dateideskriptor, in den geschrieben werden soll. Die symbolischen Konstanten STDERR_FILENO, STDIN_FILENOund STDOUT_FILENO jeweils definiert sind 2, 0und 1 in unidtd.h. Sie wollen beide anschreiben STDOUT_FILENO oder STDERR_FILENO.

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

Alternativ können Sie auch die verwenden syscall() Funktion, um einen indirekten Systemaufruf auszuführen, indem die in definierte Funktionsnummer angegeben wird syscall.h oder unistd.h. Mit dieser Methode können Sie sicherstellen, dass Sie nur Systemaufrufe verwenden. Du wirst vielleicht finden Die Linux-Systemaufruf-Schnellreferenz (PDF-Link) hilfreich sein.

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

  • Seltsam, aber syscall(4...) hat bei mir nicht funktioniert, aber syscall(1, 0, "12345\n", 6); funktionierte.

    – Exebook

    12. März 2017 um 12:52 Uhr

  • @exebook 4 ist für Mac, 1 ist für Linux

    – Vad

    24. Dezember 2017 um 10:35 Uhr

  • Link zum Syscall-Referenz-PDF defekt. Ein unvollkommener Ersatz könnte sein: syscalls.kernelgrok.com

    – Ron Burk

    10. März 2018 um 4:09 Uhr

Benutzer-Avatar
Jerry Sarg

Nein, std::ostream::write ist nicht dasselbe wie die write Systemaufruf. Es tut (fast sicher) verwenden das write Systemaufruf, zumindest auf einem System wie Linux, das so etwas hat, und es macht normalerweise ziemlich ähnliche Dinge, aber es ist immer noch eine eigene Sache.

Linux wird jedoch Standardeingabe-, Standardausgabe- und Standardfehlerströme für Ihren Prozess vorab öffnen. Um auf den Bildschirm zu schreiben, würden Sie normalerweise verwenden write (dh derjenige, der ein Systemaufruf ist), um in die Stromnummer zu schreiben 1 oder Streamnummer 2 (die jeweils Standardausgabe und Standardfehler sind).

Wenn Sie auf den Bildschirm schreiben müssen, auch wenn diese umgeleitet werden, öffnen Sie normalerweise einen Stream zu /dev/tty und (wieder) verwenden write dazu schreiben:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main() { 
    char msg[] = "hello\n";

    int fd = open("/dev/tty", O_WRONLY);
    write(fd, msg, sizeof(msg));
    return 0;
}

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

Das erste Argument ist der Dateideskriptor für STDOUT (normalerweise 1), der zweite ist der Puffer, aus dem geschrieben werden soll, der dritte ist die Größe des Textes im Puffer (-1 ist, kein Null-Terminator zu drucken).

#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);

Ihre Referenz ist falsch. Es ist Teil von C++ und hat nichts mit Ihrer Aufgabe zu tun. Die richtige Referenz ist http://www.opengroup.org/onlinepubs/9699919799/functions/write.html

1179390cookie-checkWie kann ich den Systemaufruf write() auf dem Bildschirm drucken lassen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy