【问题标题】:C check if fd is open using write(2)C 使用 write(2) 检查 fd 是否打开
【发布时间】:2017-12-10 10:50:05
【问题描述】:

可以通过系统调用write(2) 知道我发送数据的 fd 是打开还是关闭?

我的问题是我正在写一个有时关闭有时打开的 fd。我认为write这种情况一定有办法知道,但我找不到。

【问题讨论】:

  • write(2) 有返回值。
  • 为什么你的代码试图写入一个已经关闭的文件描述符?除非这是一个套接字(远程端点关闭了连接),否则如果您有尝试写入句柄的代码可能已在程序的其他地方关闭,则它说明您的程序中的错误。还是我错过了什么?
  • @selbie 连接关闭时套接字不会关闭,所以没有异常。
  • "我的问题是我正在写一个有时关闭有时打开的 fd。" 不,你的程序设计有问题。只需跟踪 fd 的状态。
  • @soissy 您的 fd 始终有效,无论客户端进程是否死亡。如果write 阻止了你,那么客户端进程没有死,或者有另一个 fd 引用同一个对象,可能是 your 进程(服务器?)。你可能在分叉后忘记关闭它。

标签: c file-descriptor errno


【解决方案1】:

您可以使用不影响文件(如果打开)的系统函数,而不是 write,使用 fstat (man page)

int fstat(int fd, struct stat *buf);

例子

struct stat buf;
if (fstat(fd, &buf) == -1) {
    // fd is either closed or not accessible 
}

fstat() 如果不能使用文件描述符,则返回-1(否则为0)。

【讨论】:

    【解决方案2】:

    来自manual page

    成功时,返回写入的字节数(零表示 什么都没写)。出错时,返回 -1,并设置 errno 适当的。

    所以只需检查 -1 的返回值

    【讨论】:

      猜你喜欢
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多