Files
llgo/_demo/select/select.go
2024-07-18 10:34:11 +08:00

45 lines
932 B
Go

package main
import (
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/os"
"github.com/goplus/llgo/c/sys"
"github.com/goplus/llgo/c/syscall"
"unsafe"
)
func main() {
var readFds syscall.FdSet
sys.FD_ZERO(&readFds)
sys.FD_SET(0, &readFds)
var tv sys.TimeVal
tv.TvSec = 5
tv.TvUSec = 0
c.Printf(c.Str("Waiting for input on stdin...\n"))
ret := sys.Select(1, &readFds, nil, nil, &tv)
if ret == -1 {
c.Perror(c.Str("select error"))
c.Exit(1)
} else if ret == 0 {
c.Printf(c.Str("Timeout occurred! No data after 5 seconds.\n"))
} else {
if sys.FD_ISSET(0, &readFds) != 0 {
var buffer [100]c.Char
n := os.Read(0, c.Pointer(&buffer[:][0]), unsafe.Sizeof(buffer)-1)
if n == -1 {
c.Perror(c.Str("read error"))
c.Exit(1)
} else if n == 0 {
c.Printf(c.Str("End of file\n"))
} else {
buffer[n] = c.Char(0)
c.Printf(c.Str("Read %ld bytes: %s\n"), n, &buffer[0])
}
}
}
}