Skip to content

syscall.EpollWait function not work correctly on mips64le, with go version1.13.9 #68366

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wudaozhong opened this issue Jul 10, 2024 · 2 comments

Comments

@wudaozhong
Copy link

Go version

go version 1.13.9 linux/mips64le

Output of go env in your module/workspace:

GO111MODULE="on"
GOARCH="mips64le"
GOMIPS64="hardfloat"

What did you do?

here is my code.

package main

import (
"fmt"
"log"
"syscall"
)

const (
epollEvents = 100
bufferSize = 1024
)

func main() {
// 创建监听套接字
listenFD, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, 0)
if err != nil {
log.Fatalf("创建socket错误: %v", err)
}
defer syscall.Close(listenFD)

// 设置地址复用
err = syscall.SetsockoptInt(listenFD, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1)
if err != nil {
	log.Fatalf("设置地址复用错误: %v", err)
}

// 绑定地址和端口
addr := syscall.SockaddrInet4{Port: 8080}
copy(addr.Addr[:], []byte{0, 0, 0, 0}) // 绑定到所有IPv4地址
if err := syscall.Bind(listenFD, &addr); err != nil {
	log.Fatalf("绑定socket错误: %v", err)
}

// 开始监听
if err := syscall.Listen(listenFD, syscall.SOMAXCONN); err != nil {
	log.Fatalf("监听错误: %v", err)
}
fmt.Println("监听器已启动,监听端口: 8080")

// 创建epoll实例,带有CLOEXEC标志
epollFD, err := syscall.EpollCreate1(syscall.EPOLL_CLOEXEC)
if err != nil {
	log.Fatalf("创建epoll实例错误: %v", err)
}
defer syscall.Close(epollFD)

// 将监听套接字的文件描述符注册到epoll中
ev := syscall.EpollEvent{Events: syscall.EPOLLIN, Fd: int32(listenFD)}
if err := syscall.EpollCtl(epollFD, syscall.EPOLL_CTL_ADD, listenFD, &ev); err != nil {
	log.Fatalf("注册监听FD到epoll错误: %v", err)
}

// 创建 eventfd 实例
eventFD, _, errno := syscall.Syscall(syscall.SYS_EVENTFD2, 0, 0, syscall.EFD_CLOEXEC)
if errno != 0 {
	log.Fatalf("创建eventfd错误: %v", errno)
}
defer syscall.Close(int(eventFD))

// 将 eventfd 的文件描述符注册到 epoll 中
ev = syscall.EpollEvent{Events: syscall.EPOLLIN, Fd: int32(eventFD)}
if err := syscall.EpollCtl(epollFD, syscall.EPOLL_CTL_ADD, int(eventFD), &ev); err != nil {
	log.Fatalf("注册eventfd到epoll错误: %v", err)
}

events := make([]syscall.EpollEvent, epollEvents)

for {
	n, err := syscall.EpollWait(epollFD, events, -1)
	if err != nil {
		log.Fatalf("epoll等待错误: %v", err)
	}

	for i := 0; i < n; i++ {
		if events[i].Fd == int32(listenFD) {
			// 处理新的连接
			connFD, _, err := syscall.Accept(listenFD)
			if err != nil {
				log.Printf("接受连接错误: %v", err)
				continue
			}

			// 将新连接的文件描述符注册到epoll中
			ev := syscall.EpollEvent{Events: syscall.EPOLLIN, Fd: int32(connFD)}
			if err := syscall.EpollCtl(epollFD, syscall.EPOLL_CTL_ADD, connFD, &ev); err != nil {
				log.Printf("注册连接FD到epoll错误: %v", err)
				syscall.Close(connFD)
				continue
			}
		} else if events[i].Fd == int32(eventFD) {
			// 处理eventfd事件
			var buf [8]byte
			if _, err := syscall.Read(int(eventFD), buf[:]); err != nil {
				log.Printf("读取eventfd错误: %v", err)
			}
			fmt.Println("eventfd事件触发")
		} else {
			// 处理现有连接的数据
			handleConnection(int(events[i].Fd))
		}
	}
}

}

func handleConnection(fd int) {
defer syscall.Close(fd)
buf := make([]byte, bufferSize)

for {
	n, err := syscall.Read(fd, buf)
	if err != nil {
		log.Printf("读取连接错误: %v", err)
		return
	}
	if n == 0 {
		break
	}
	fmt.Printf("接收到数据: %s\n", string(buf[:n]))

	// Echo回客户端
	_, err = syscall.Write(fd, buf[:n])
	if err != nil {
		log.Printf("写入连接错误: %v", err)
		return
	}
}

}

What did you see happen?

the event Fd of the events from function syscall.EpollWait is always zero, so that my program not work?

What did you expect to see?

syscall.EpollWait function work normally

@seankhliao
Copy link
Member

1.13 is not a version we support.

@seankhliao seankhliao closed this as not planned Won't fix, can't repro, duplicate, stale Jul 10, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants