Überlegen Sie:
%Vor%Das Ergebnis muss signiert sein, um -1 bei einem Fehler usw. zu berücksichtigen, und ist daher ssize_t. Aber warum sollte dann die Anfrage ein vorzeichenloser Betrag sein (doppelt so groß), wenn das Ergebnis der Abfrage nach mehr als ssize_t nicht definiert ist?
Gibt es eine signifikante Optimierung im Kernel, indem nicht auf die Signedness des Zählparameters geprüft wird? Oder etwas anderes?
Nach der Dokumentation für ssize_t write(int fildes, const void *buf, size_t nbyte)
Wenn der Wert von nbyte größer als {SSIZE_MAX} ist, ist das Ergebnis implementierungsdefiniert.
So kann jede bestimmte Implementierung diese Situation anders behandeln. Ich wäre nicht überrascht, wenn einige Implementierungen einfach EFBIG
setzen.
Vielleicht ist size_t
einfach der beste Typ, um die Größe des Puffers semantisch darzustellen? Es besagt, dass dieses Argument eine nichtnegative Größe ist und sonst nichts.
Ich denke, es ist nett, da size_t
der Typ des vom Operator sizeof
zurückgegebenen Wertes ist, erlaubt dies Aufrufe wie folgt:
Wenn die Funktion die signierte Version verwendet, ist eine Besetzung erforderlich. Wie andere bereits festgestellt haben, können semantische Funktionen wie diese keinen negativen Wert akzeptieren, so dass es nicht sinnvoll ist, sie zu akzeptieren.
write
kann nur von einem einzelnen zusammenhängenden Array von unsigned char
schreiben, das nicht größer als PTRDIFF_MAX
sein kann (dies gilt für alle POSIX-Systeme in der realen Welt, und vielleicht wird dies auch von POSIX benötigt ...) ?) gleich SIZE_MAX/2
. Wenn also ein Wert übergeben wird, der negativ wäre, wenn er als vorzeichenbehafteter Wert interpretiert wird, ist dies zunächst ein Programmierfehler - die übergebene Größe stimmt nicht mit dem verfügbaren Platz im Puffer überein.
Theoretisch könnten readv
und writev
IO-Operationen durchführen, die größer sind als SIZE_MAX/2
, indem die gleichen iov
Puffer mehrmals im Array wiederholt werden. Wenn ich mich jedoch richtig erinnere, wird angegeben, dass die Summe fehlschlägt Größe wäre größer als SSIZE_MAX
.