【问题标题】:undefined: syscall.SIGURG on a working code未定义:syscall.SIGURG 在工作代码上
【发布时间】:2020-08-13 13:19:54
【问题描述】:

我是新手,目前正在尝试理解同事编写的一些代码

go func() {
    s := <-sigs
    if s == syscall.SIGURG {
        fmt.Println("received sigur")
    } else {
        log.Printf("RECEIVED SIGNAL: %s", s)
        os.Exit(1)
    }
}()

我同时使用了 GoLand 和 VSCode,这两个 IDE 在 if s == syscall.SIGURG { 上报告错误 他们抛出undefined: syscall.SIGURG

问题是,我知道这段代码可以在 Debian 上运行。所以我正在尝试为什么它不能在我的 Windows 计算机上运行

我有所需的进口:

import ( 
    "fmt"
    "os"
    "os/signal"
    "syscall"
)

【问题讨论】:

  • Windows 没有 SIGURG。
  • 无法模拟吗?否则,我将从现在开始在 Debian 上进行双重引导。你能把它写成答案而不是命令,所以我会接受吗?
  • 你不需要双启动,如果你的主操作系统是Windows,你可以使用WSL docs.microsoft.com/en-us/windows/wsl/about
  • 不,你不能“模拟”一个不存在的信号。你可以做什么:保护 xyz_linux.go 文件中的那段代码,并有一个单独的 xyz_windows.go 提供相同的 API(但不使用 SIGURG)。或者干脆停止使用 Windows :-)
  • 我会使用 WSL,直到我可以在 Debian 上编码!

标签: go system-calls


【解决方案1】:

正如@Volker 在评论中所写,SIGURG 在 Windows 上不存在。它存在于类 Unix 系统上,比如 Debian。

我相信,如果您将代码更改为使用 golang.org/x/sys/unix 而不是 syscall,那么您的行为会更加明显。 syscall 包的 Golang 文档有 the following deprecation notice:

已弃用:此软件包已被锁定。调用者应该使用golang.org/x/sys 存储库中的相应包。这也是应该应用新系统或版本所需的更新的地方。请参阅https://golang.org/s/go1.4-syscall 了解更多信息。

还有用于 Windows 的包 golang.org/x/sys/windows,它不包括 SIGURG,因为它在 Windows 上不存在。

【讨论】:

  • 这是正确的答案。我只想补充一点,我将使用@marco.m 提到的 WSL,直到我可以像我应该的那样在 Debian 上编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 2020-02-06
  • 2022-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多