Rationale für Systemaufrufe, die die Anfrage von size_t, aber das Ergebnis von nur ssize_t erlauben?

8

Ü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?

    
ValenceElectron 02.05.2011, 16:30
quelle

4 Antworten

6

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.

    
Cubbi 02.05.2011, 16:39
quelle
5

Ich denke, es ist nett, da size_t der Typ des vom Operator sizeof zurückgegebenen Wertes ist, erlaubt dies Aufrufe wie folgt:

%Vor%

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.

    
unwind 02.05.2011 17:02
quelle
2

Wenn Sie den Parameter vorzeichenlos machen, müssen Sie nicht mehr auf unsinnige negative Anfragen prüfen.

    
Mark B 02.05.2011 16:37
quelle
1

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 .

    
R.. 02.05.2011 16:37
quelle

Tags und Links