aio_write oder aio_write64 -Subroutine
Die Subroutine aio_write enthält Informationen für die Subroutine POSIX AIO aio_write (wie in IEEE std 1003.1-2001definiert) und die Subroutine Legacy AIO aio_write.
POSIX AIO-Subroutine aio_write
Zweck
Schreibt asynchron in eine Datei.
Bibliothek
Standard-C-Bibliothek (libc.a)
Syntax
#include <aio.h>
int aio_write (aiocbp)
struct aiocb *aiocbp;
Beschreibung
Die Subroutine aio_write schreibt aio_nbytes in die Datei, die aio_fildes zugeordnet ist, aus dem Puffer, auf den aio_bufverweist. Die Subroutine kehrt zurück, wenn die Schreibanforderung eingeleitet oder in die Datei oder Einheit eingereiht wurde.
Der Parameter aiocbp kann als Argument für die Subroutinen aio_error und aio_return verwendet werden, um den Fehlerstatus bzw. Rückgabestatus der asynchronen Operation zu bestimmen, während sie fortgesetzt wird.
Der Parameter aiocbp verweist auf eine aiocb -Struktur. Wenn der Puffer, auf den aio_buf verweist, oder der Steuerblock, auf den aiocbp verweist, vor der asynchronen E/A-Beendigung zu einer unzulässigen Adresse wird, ist das Verhalten nicht definiert.
Wenn das Flag O_APPEND für den Dateideskriptor aio_fildes nicht gesetzt ist, findet die angeforderte Operation an der durch aio_offsetangegebenen absoluten Position in der Datei statt. Dies geschieht so, als wäre die Subroutine lseek unmittelbar vor der Operation mit einem Offset gleich aio_offset und einem whence gleich SEEK_SETaufgerufen worden. Wenn das Flag O_APPEND für den Dateideskriptor gesetzt ist, hängen Schreiboperationen Daten in Byte in derselben Reihenfolge an die Datei an, in der die Aufrufe abgesetzt wurden, außer unter den im Abschnitt "Asynchrone E/A" auf der Website System Interfaces and XBD Headers beschriebenen Umständen. Nach einem erfolgreichen Aufruf zum Einreihen einer asynchronen E/A-Operation ist der Wert der relativen Dateiadresse für die Datei nicht angegeben.
Das Feld aio_lio_opcode wird von der Subroutine aio_write ignoriert.
Wenn die priorisierte Ein-/Ausgabe für diese Datei unterstützt wird, wird die asynchrone Operation mit einer Priorität übergeben, die der Ausführungspriorität des Prozesses minus aiocbp->aio_reqprioentspricht.
Gleichzeitige asynchrone Operationen, die dieselben aiocbp verwenden, führen zu nicht definierten Ergebnissen.
Wenn die synchronisierte Ein-/Ausgabe für die Datei aktiviert ist, die aio_fildeszugeordnet ist, entspricht das Verhalten dieser Subroutine den Definitionen für den Abschluss der synchronisierten E/A-Datenintegrität und den Abschluss der synchronisierten E/A-Dateiintegrität.
Für jede Systemaktion, die den Prozessspeicherbereich ändert, während eine asynchrone Ein-/Ausgabe aussteht, ist das Ergebnis dieser Aktion nicht definiert.
Bei regulären Dateien erfolgt keine Datenübertragung über den in der Beschreibung der offenen Datei, die aio_fildeszugeordnet ist, festgelegten maximalen Offset hinaus.
Wenn Sie die Subroutine aio_write oder aio_write64mit einem Dateideskriptor verwenden, der aus einem Aufruf der Subroutine shm_open abgerufen wurde, schlägt sie mit EINVALfehl.
Parameter
| Element | Beschreibung |
|---|---|
| aiocbp | Verweist auf die aiocb -Struktur, die der E/A-Operation zugeordnet ist |
aiocb-struktur
int aio_fildes
off_t aio_offset
char *aio_buf
size_t aio_nbytes
int aio_reqprio
struct sigevent aio_sigevent
int aio_lio_opcodeAusführungsumgebung
Die Subroutinen aio_write und aio_write64 können nur von der Prozessumgebung aufgerufen werden.
Rückgabewerte
Die Subroutine aio_write gibt eine 0 an den aufrufenden Prozess zurück, wenn die E/A-Operation erfolgreich in die Warteschlange gestellt wurde. Andernfalls wird -1 zurückgegeben, und die globale Variable errno wird gesetzt, um den Fehler anzuzeigen.
Fehlercodes
| Element | Beschreibung |
|---|---|
| EAGAIN | Die angeforderte asynchrone E/A-Operation wurde aufgrund von Einschränkungen der Systemressourcen nicht in die Warteschlange gestellt. |
| Element | Beschreibung |
|---|---|
| EBADF | Der Parameter aio_fildes ist kein gültiger Dateideskriptor, der zum Schreiben geöffnet ist. |
| EINVAL | Der durch aio_offset implizierte Wert für den Dateioffset ist ungültig, aio_reqprio ist ein ungültiger Wert oder aio_nbytes ist ein ungültiger Wert. Die Subroutine aio_write oder aio_write64 wurde mit einem Dateideskriptor verwendet, der aus dem Aufruf der Subroutine shm_open abgerufen wurde. |
| Element | Beschreibung |
|---|---|
| EBADF | Der Parameter aio_fildes ist kein gültiger Dateideskriptor, der zum Schreiben geöffnet ist. |
| EINVAL | Der von aio_offset implizierte Dateioffsetwert wäre ungültig. |
| ABGEBROCHEN | Die angeforderte Ein-/Ausgabe wurde abgebrochen, bevor die Ein-/Ausgabe aufgrund einer aio_cancel -Anforderung beendet wurde. |
| Element | Beschreibung |
|---|---|
| EFBIG | Die Datei ist eine reguläre Datei, aio_nbytes ist größer als 0 und der Anfangsoffset in aio_offset ist größer-gleich dem Offset-Maximum in der offenen Dateibeschreibung, die aio_fildeszugeordnet ist. |
Traditionelle AIO-Subroutine aio_write
Zweck: Schreibt asynchron in eine Datei.
Bibliothek (traditionelle AIO-Subroutine aio_write)
Standard-C-Bibliothek (libc.a)
Syntax (traditionelle AIO-Subroutine aio_write)
#include <aio.h>
Beschreibung (traditionelle AIO-Subroutine aio_write)
Die Subroutine aio_write schreibt asynchron in eine Datei. Insbesondere schreibt die Subroutine aio_write aus einem Puffer in die Datei, die dem Parameter FileDescriptor zugeordnet ist. Um dies zu handhaben, verwendet die Subroutine Informationen aus der Struktur aio control block (aiocb) , auf die der Parameter aiocbp verweist. Diese Informationen umfassen die folgenden Felder:
| Element | Beschreibung |
|---|---|
| aio_buf | Gibt den zu verwendenden Puffer an |
| aio_nbytes | Gibt die Anzahl der zu schreibenden Byte an. |
Die Subroutine aio_write64 ähnelt der Subroutine aio_write mit der Ausnahme, dass sie einen Referenzparameter aiocb64 verwendet. Auf diese Weise kann die Subroutine aio_write64 Offsets angeben, die über OFF_MAX (2 Gigabyte minus 1) hinausgehen.
In der Programmierumgebung mit Unterstützung für große Dateien wird aio_read als aio_read64neu definiert.
Wenn Sie die Subroutine aio_write oder aio_write64 mit einem Dateideskriptor verwenden, der aus einem Aufruf der Subroutine shm_open abgerufen wurde, schlägt sie mit EINVALfehl.
Wenn die Schreibanforderung in die Warteschlange gestellt wurde, aktualisiert die Subroutine aio_write den Dateizeiger, der durch dieaio_whenceundaio_offsetFelder in der aiocb -Struktur so, als wäre die angeforderte Ein-/Ausgabe abgeschlossen. Anschließend kehrt er zum aufrufenden Programm zurück. Deraio_whenceundaio_offsetFelder haben dieselbe Bedeutung wie die Parameter whence und offset in der Subroutine lseek . Die Subroutine ignoriert sie für Dateiobjekte, die nicht suchen können.
Wenn während des Aufrufs ein Fehler auftritt, wird die Schreibanforderung nicht eingeleitet oder in die Warteschlange gestellt. Verwenden Sie die Subroutine aio_error , um den Status einer Anforderung zu bestimmen.
Damit der aufrufende Prozess das Signal SIGIO empfängt, wenn die E/A-Operation abgeschlossen ist, setzen Sie das Bit AIO_SIGNAL in deraio_flagFeld in der aiocb -Struktur.
#define _AIO_AIX_SOURCE
#include <sys/aio.h>Geben Sie in der Befehlszeile bei der Kompilierung Folgendes ein:->xlc ... -D_AIO_AIX_SOURCE ... legacy_aio_program.c Da priorisierte Ein-/Ausgabe derzeit nicht unterstützt wird, wird das Feld aio_reqprio der Struktur derzeit nicht verwendet.
Parameter (traditionelle AIO-Subroutine aio_write)
| Element | Beschreibung |
|---|---|
| FileDescriptor | Gibt das zu schreibende Objekt an, das von einem Aufruf zum Öffnen zurückgegeben wurde. |
| aiocbp | Verweist auf die asynchrone E/A-Steuerblockstruktur, die der E/A-Operation zugeordnet ist. |
aiocb-struktur
struct aiocb
{
int aio_whence;
off_t aio_offset;
char *aio_buf;
ssize_t aio_return;
int aio_errno;
size_t aio_nbytes;
union {
int reqprio;
struct {
int version:8;
int priority:8;
int cache_hint:16;
} ext;
} aio_u1;
int aio_flag;
int aio_iocpfd;
aio_handle_t aio_handle;
}
#define aio_reqprio aio_u1.reqprio
#define aio_version aio_u1.ext.version
#define aio_priority aio_u1.ext.priority
#define aio_cache_hint aio_u1.ext.cache_hintAusführungsumgebung (traditionelle AIO-Subroutine aio_write)
Die Subroutinen aio_write und aio_write64 können nur von der Prozessumgebung aufgerufen werden.
Rückgabewerte (traditionelle AIO-Subroutine aio_write)
Wenn die Schreibanforderungswarteschlange erfolgreich ist, gibt die Subroutine aio_write den Wert 0 zurück. Andernfalls gibt es den Wert -1 zurück und setzt die globale Variable errno, um den Fehler zu identifizieren.
Rückgabecodes können auf die folgenden errno -Werte gesetzt werden:
| Element | Beschreibung |
|---|---|
| EAGAIN | Gibt an, dass die Systemressourcen, die für die Warteschlange der Anforderung erforderlich sind, nicht verfügbar sind. Insbesondere kann die Übertragungswarteschlange voll sein oder die maximale Anzahl Öffnungsvorgänge erreicht sein. |
| EBADF | Gibt an, dass der Parameter FileDescriptor nicht gültig ist. |
| EFAULT | Gibt an, dass die mit dem Parameter aiocbp angegebene Adresse ungültig ist. |
| EINVAL | Gibt an, dass dieaio_whenceFeld hat keinen gültigen Wert oder der Ergebniszeiger ist ungültig. Die Subroutine aio_write oder aio_write64 wurde mit einem Dateideskriptor verwendet, der aus dem Aufruf der Subroutine shm_open abgerufen wurde. |
Bei Verwendung von I/O Completion Ports mit AIO-Anforderungen können Rückgabecodes auch auf die folgenden errno-Werte gesetzt werden:
| Element | Beschreibung |
|---|---|
| EBADF | Gibt an, dass dieaio_iocpfdFeld in der aiocb-Struktur ist kein gültiger Dateideskriptor für I/O Completion Port. |
| EINVAL | Zeigt an, dass ein I/O Completion Port-Service beim Versuch, die AIO-Anforderung zu starten, fehlgeschlagen ist. |
| EPERM | Gibt an, dass die I/O Completion Port-Services nicht verfügbar sind. |