Ich habe den folgenden Go-Code, der schließlich die Festplatte füllen und mit ENOSPC
(nur ein Beweis des Konzepts) fehlschlagen wird. Wie kann ich aus der err
von os.Write
zurückgegeben, dass es in der Tat wegen ENOSPC
fehlgeschlagen (so brauche ich eine Möglichkeit, nach der Schreiboperation errno
greifen)?Errno nach einer Schreiboperation
package main
import (
"log"
"os"
)
func main() {
fd, _ := os.Create("dump.txt")
defer fd.Close()
for {
buf := make([]byte, 1024)
_, err := fd.Write(buf)
if err != nil {
log.Fatalf("%T %v", err, err)
}
}
}
EDIT: das Programm als @FUZxxl Aktualisiert vorgeschlagen:
package main
import (
"log"
"os"
"syscall"
)
func main() {
fd, _ := os.Create("dump.txt")
defer fd.Close()
for {
buf := make([]byte, 1024)
_, err := fd.Write(buf)
if err != nil {
log.Printf("%T %v\n", err, err)
errno, ok := err.(syscall.Errno)
if ok {
log.Println("type assert ok")
if errno == syscall.ENOSPC {
log.Println("got ENOSPC")
}
} else {
log.Println("type assert not ok")
}
break
}
}
}
Allerdings bin ich nicht das erwartete Ergebnis. Hier ist die Ausgabe:
2015/02/15 10:13:27 *os.PathError write dump.txt: no space left on device
2015/02/15 10:13:27 type assert not ok
Ich dachte eigentlich, das funktionieren würde, aber es scheint 'err' kann nicht in' syscall.Errno' umgewandelt werden :(Siehe meine aktualisierte Frage – Unknown
@Unknown Das ist komisch Kannst du mir sagen was 'fmt.Printf ("% T ", err)' sagt? Auf welcher Plattform bist du? – fuz
Du kannst es in der obigen Ausgabe sehen, 'err' ist ein '* os.PathError'. Ich bin auf Linux amd64. – Unknown