当前位置: 首页 > 面试题库 >

Golang错误的文件描述符

井唯
2023-03-14
问题内容

尝试附加到go例程中的日志文件时,我得到了错误的文件描述符。

write ./log.log: bad file descriptor

该文件存在,并且具有666的权限。起初我想很好,也许是因为他们每个人都试图同时打开文件。我实现了一个互斥体来尝试避免这种情况,但是遇到了同样的问题,因此我将其删除。

logCh := make(chan string, 150)
go func() {
    for {
        msg, ok := <-logCh
        if ok {
            if f, err := os.OpenFile("./log.log", os.O_APPEND, os.ModeAppend); err != nil {
                panic(err)
            } else {
                logTime := time.Now().Format(time.RFC3339)
                if _, err := f.WriteString(logTime + " - " + msg); err != nil {
                    fmt.Print(err)
                }
                f.Close()
            }
        } else {
            fmt.Print("Channel closed! \n")
            break
        }
    }
}()

问题答案:

您需要添加O_WRONLY标志:

if f, err := os.OpenFile("./log.log", os.O_APPEND|os.O_WRONLY, os.ModeAppend); err != nil { /*[...]*/ }

为了说明,这是Linux文档open:http : //man7.org/linux/man-
pages/man2/openat.2.html

参数标志必须包括以下访问模式之一:O_RDONLY,O_WRONLY或O_RDWR。这些请求分别打开文件为只读,只写或读/写。

如果检查/usr/local/go/src/syscall/zerrors_linux_amd64.go:660,则可以看到:

O_RDONLY                         = 0x0
O_RDWR                           = 0x2
O_WRONLY                         = 0x1

因此,默认情况下,您将获得一个只读文件描述符。



 类似资料:
  • 文件描述符 Linux很重要的设计思想就是一切皆文件,网络是文件,键盘等外设也是文件,很神奇吧?于是所有资源都有了统一的接口,开发者可以像写文件那样通过网络传输数据,我们也可以通过/proc/的文件看到进程的资源使用情况。 内核给每个访问的文件分配了文件描述符(File Descriptor),它本质是一个非负整数,在打开或新建文件时返回,以后读写文件都要通过这个文件描述符了。 应用 我们想想操作

  • 文件描述符接口 函数 int  fd_new (void)   分配文件描述符   struct dfs_fd *  fd_get (int fd)   获取文件描述结构   void  fd_put (struct dfs_fd *fd)   放置文件描述符   int  fd_is_open (const char *pathname)   判断文件是否已被打开   int  select (

  • 更新 经过一些调试后,我发现给定代码中的Catch块在执行时没有任何异常。我打印了返回一些值的inputstream,事件bitmap varibale被初始化,但是一旦它执行了catch块,它就向onPostExecute方法返回null。 寻找为什么会发生这种情况? 请查看工作室的调试截图 结束 我使用的是 Android Studio 3.0。 创建了具有Kotlin支持的简单android

  • 问题内容: 有没有办法在原始文件描述符而不是FILE *上执行ftell()的操作(返回文件中的当前位置)?我认为应该有,因为您可以使用lseek()查找原始文件描述符。 我知道我可以使用fdopen()创建与文件描述符相对应的FILE *,但我宁愿不这样做。 问题答案: 只需使用:

  • 问题内容: 我的代码是这样的: 它在第一次运行时效果很好,但之后每次都给我Errno 9。我究竟做错了什么? 顺便说一句, 问题答案: 您在关闭的同一套接字上调用。你不能那样做。 至于该文档的说: 套接字对象上所有以后的操作都将失败。 只需将(或您拥有的任何东西)移动到循环中即可。(或者,如果愿意的话,可以分两步使用而不是这样做,这更容易出错,也意味着您不必猜测IPv4与IPv6等)。

  • 当使用了大量虚拟主机,而且每个主机又使用了不同的日志文件时,Apache可能会遭遇文件描述符(有时也称为文件句柄)耗尽的困境。Apache使用的文件描述符总数如下:每个不同的错误日志文件一个、每个其他日志文件指令一个、再加10-20个作为内部使用。Unix操作系统限制了每个进程可以使用的文件描述符数量。典型上限是64个,但可以进行扩充,直至到达一个很大的硬件限制为止(hard-limit)。 尽管