Files
llgo/_demo/select/select.go

45 lines
932 B
Go
Raw Normal View History

2024-07-16 11:49:38 +08:00
package main
import (
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/os"
2024-07-18 10:28:14 +08:00
"github.com/goplus/llgo/c/sys"
"github.com/goplus/llgo/c/syscall"
2024-07-16 11:49:38 +08:00
"unsafe"
)
func main() {
2024-07-18 10:28:14 +08:00
var readFds syscall.FdSet
2024-07-16 11:49:38 +08:00
2024-07-18 10:28:14 +08:00
sys.FD_ZERO(&readFds)
2024-07-16 11:49:38 +08:00
2024-07-18 10:28:14 +08:00
sys.FD_SET(0, &readFds)
2024-07-16 11:49:38 +08:00
2024-07-18 10:28:14 +08:00
var tv sys.TimeVal
2024-07-16 11:49:38 +08:00
tv.TvSec = 5
tv.TvUSec = 0
c.Printf(c.Str("Waiting for input on stdin...\n"))
2024-07-18 10:28:14 +08:00
ret := sys.Select(1, &readFds, nil, nil, &tv)
2024-07-16 11:49:38 +08:00
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 {
2024-07-18 10:28:14 +08:00
if sys.FD_ISSET(0, &readFds) != 0 {
2024-07-16 11:49:38 +08:00
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])
}
}
}
}