Schreiben Sie den Systemaufruf in C++
In diesem Tutorial wird die Methode zum Aufrufen des write
-Systems aus einem in C++ geschriebenen Programm besprochen. Zuerst werden wir die Systemaufrufe schnell aktualisieren, insbesondere den Systemaufruf write
und seinen Prototyp.
Später werden wir den Aufruf des Systemaufrufs write
aus einem C++-Programm besprechen.
Systemaufruf in C++
Jedes Betriebssystem stellt über Systemaufrufe eine Reihe von Diensten bereit. Es ist ein Mechanismus für Computerprogramme, um einen Dienst vom Betriebssystem anzufordern.
Systemaufrufe bieten die folgenden Dienste:
- Prozesserstellung und -verwaltung
- Hauptspeicherverwaltung
- Datei- und Dateisystemverwaltung
- Geräteeingang/-ausgang
- Schutz
- Netzwerken
Der häufigste von Programmen benötigte Dienst ist Input/Output. Als nächstes werden wir den Systemaufruf write
besprechen.
Die Programme fordern das zugrunde liegende Betriebssystem auf, durch Systemaufrufe Schreiben
auf ein Gerät zu schreiben.
Bevor Sie sich dem write
-Aufruf zuwenden, ist es wichtig, sich eine Vorstellung von einem Dateideskriptor zu machen.
Dateideskriptor
In Unix und Unix-basierten Betriebssystemen ist ein Dateideskriptor eine Zahl, die eine Datei oder andere E/A-Ressourcen wie einen Socket oder eine Pipe eindeutig identifiziert.
Normalerweise ist der Dateideskriptor ein nicht negativer ganzzahliger Wert. Programme greifen auf Dateien für IO über Dateideskriptoren zu.
Die Bibliotheksfunktionen behandeln IO und nehmen den Dateideskriptor als Parameter.
Der erste Schritt besteht darin, eine Datei mit dem Namen (Pfad absolut/relativ, falls sich die Datei nicht im Programmordner befindet) zu öffnen, um auf eine Datei für IO zuzugreifen.
Wenn die Funktion open
eine Datei erfolgreich öffnet (d. h. eine Datei mit demselben Namen existiert und der Benutzer die erforderlichen Rechte hat), gibt sie einen Dateideskriptor zurück.
int fd = open("abc.txt", O_RDONLY | O_CREAT);
Die Öffnen
-Funktion hat zwei Parameter. Der erste Parameter ist der Dateiname und der zweite der Lesemodus (z. B. Nur-Lese-Modus, Nur-Schreiben usw.).
Die nachfolgenden IO-Operationen in der Datei werden durch den Dateideskriptor durchgeführt.
der Systemaufruf write
in C++
Der Systemaufruf write
ist eine der grundlegendsten Routinen, die vom Kernel des Betriebssystems bereitgestellt werden. Es schreibt Daten aus dem Primärspeicher (einem Puffer) in die Datei (die auf einem Hardwaregerät gespeichert ist).
Der Systemaufruf write()
schreibt bis zu count
Bytes aus dem Speicherpuffer, auf den buf
zeigt, in eine Datei, auf die durch den Dateideskriptor verwiesen wird.
Es ist eine Low-Level-Funktion, die nur Bytes verstehen kann. Der write
-Aufruf kann nicht zum Schreiben von Datensätzen wie Klassen verwendet werden.
Daher sind Eingabe-Ausgabe-Funktionen auf höherer Ebene (wie printf()
) unvermeidlich, um komplexe I/O auszuführen.
Sehen wir uns zunächst die Syntax des Systemaufrufs write
an, der zum Schreiben von Daten in eine Datei verwendet wird.
ssize_t write(int fd, const void *buf, size_t count);
Die drei Parameter der write
-Funktion im Detail sind:
- Der Dateideskriptor
fd
wird aus dem Aufruf zum Öffnen einer Datei erhalten. Es ist ein ganzzahliger Wert. Die Werte0
,1
und2
können auch jeweils für Standardeingabe, Standardausgabe und Standardfehler angegeben werden. - Der Zeiger auf einen Puffer
buf
im Speicher, wo die Daten im Primärspeicher gespeichert werden. - Die Anzahl der durch
count
spezifizierten Bytes, die in die Datei geschrieben werden sollen, auf diefd
zeigt, aus dem Pufferbuf
.
Die Typen ssize_t
und size_t
sind jeweils vorzeichenbehaftete und vorzeichenlose ganzzahlige Datentypen, die in stddef.h
definiert sind.
Rückgabewert
Die Funktion write
gibt einen vorzeichenbehafteten Wert zurück. Bei Erfolg wird die Anzahl der erfolgreich in die Datei geschriebenen Bytes zurückgegeben, die manchmal kleiner als der angegebene count
sein kann.
Die möglichen Gründe dafür, dass die Gesamtzahl der geschriebenen Bytes kleiner als die Anzahl
ist, können sein, dass der Speicher des Ausgabegeräts voll ist oder dass der Quell-Schreibpuffer weniger Zeichen
zu schreiben hat als die in der Anzahl
angegebene Anzahl.
Bei einem Fehler gibt der write
-Systemaufruf -1
zurück, und errno
wird gesetzt, um den aufgetretenen Fehler anzuzeigen.
Hier haben wir ein vollständiges Programm, um mit dem Systemaufruf write
in die Datei zu schreiben.
#include <errno.h>
#include <fcntl.h>
#include <iostream>
extern int errno;
using namespace std;
int main() {
int fd, count;
fd = open("abc.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
cout << "File descriptor = " << fd << '\n';
if (fd == -1) {
// print which type of error have in a code
printf("Error Number % d\n", errno);
// print program detail "Success or failure"
perror("Program");
}
char buff[] = "This is a test program to check write system call.";
count = write(fd, buff, 50);
if (count == -1)
cout << "Error writing in file";
else
cout << "Number of bytes written to the file: " << count << '\n';
close(fd);
return 0;
}
Die erste Header-Datei fcntl.h
hat einen Systemaufruf write
. Die zweite Header-Datei hat Fehlerfunktionen.
Beim Funktionsaufruf öffnen
erstellen wir im Schreibmodus einen neuen Dateinamen abc.txt
. Die Datei kann vorher existieren, aber mit O_TRUNC
wird der vorherige Inhalt entfernt und eine neue leere Datei erstellt.
Der Code 0644
gibt die Dateiberechtigungen an. Als nächstes prüft die if
-Bedingung, ob die Datei erfolgreich geöffnet wurde oder nicht.
Im Fehlerfall wird die Fehlermeldung angezeigt.
Als Nächstes haben wir ein Zeichenarray (das als Puffer verwendet werden soll) mit einem Beispieltext erstellt. Schließlich schreiben wir in die Datei.
Der dritte Parameter ist 50
und gibt die Anzahl der zu schreibenden Zeichen aus dem buff
-Array an.
Der count
ist der ganzzahlige Wert, der vom API-Aufruf write()
zurückgegeben wird. Im Fehlerfall ist der Wert -1
; Daher überprüfen wir die Zählung und drucken die entsprechende Fehlermeldung aus.
Im Falle eines erfolgreichen Schreibvorgangs haben wir einen positiven Wert von count, und die if
-Bedingung zeigt die Gesamtzahl der erfolgreich in die Datei geschriebenen Bytes.
Die erste Ausgabe, Wert 3
, zeigt, dass die Datei erfolgreich geöffnet wurde. In der zweiten Zeile zeigt 50
an, dass alle 50 Bytes erfolgreich geschrieben wurden.
Als nächstes haben wir die open
-Anweisung modifiziert.
fd = open("abc.txt", O_RDONLY | O_CREAT | O_TRUNC, 0644);
Beachten Sie, dass wir O_WRONLY
durch O_RDONLY
ersetzt haben, und als Ergebnis lautet die Ausgabe:
File descriptor = -1
Error Number 13
Program: Permission denied
Error writing in file
Unsere Öffnen
-Operation ist fehlgeschlagen, da es unmöglich ist, eine vorhandene Datei im Lesemodus zu öffnen, indem der Inhalt abgeschnitten wird.
Als Ergebnis des Fehlers können Sie sehen, dass der Dateideskriptor -1
ist. Auch der Schreibvorgang ist nicht erfolgreich.
Wenn wir die Datei vor dem Systemaufruf write
schließen, ist das Ergebnis eine erfolglose Operation durch einen Systemaufruf write
. In diesem Fall sollte die Ausgabe in etwa so aussehen:
File descriptor = 3
Error writing in file
Hier ist der Dateideskriptor nicht -1
, aber die Datei ist geschlossen; daher schlägt der Systemaufruf write
fehl.
Der vom Systemaufruf write
zurückgegebene Wert ist -1
. Daher wird eine Fehlermeldung gedruckt.