Schreiben Sie den Systemaufruf in C++

Abdul Mateen 15 Februar 2024
  1. Systemaufruf in C++
  2. der Systemaufruf write in C++
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:

  1. Prozesserstellung und -verwaltung
  2. Hauptspeicherverwaltung
  3. Datei- und Dateisystemverwaltung
  4. Geräteeingang/-ausgang
  5. Schutz
  6. 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:

  1. Der Dateideskriptor fd wird aus dem Aufruf zum Öffnen einer Datei erhalten. Es ist ein ganzzahliger Wert. Die Werte 0, 1 und 2 können auch jeweils für Standardeingabe, Standardausgabe und Standardfehler angegeben werden.
  2. Der Zeiger auf einen Puffer buf im Speicher, wo die Daten im Primärspeicher gespeichert werden.
  3. Die Anzahl der durch count spezifizierten Bytes, die in die Datei geschrieben werden sollen, auf die fd zeigt, aus dem Puffer buf.

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.

Systemaufruf schreiben

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.