C - 带有F_GETFD标志的 fcntl() 的返回值?



我在文件描述符上使用fcntl()并调用以下内容:

Retval = select(
MaxSocketId + 1,
&ReadSocketSet,
(fd_set *)NULL,
(fd_set *)NULL,
(struct timeval *)NULL
);
if (Retval <= 0) {
for (lIndexFD = 3; lIndexFD < (MaxSocketId + 1); lIndexFD++) {
if ((lFlag = fcntl(lIndexFD, F_GETFD)) < 0) {
if (errno == 9) {
FD_CLR(lIndexFD, &ActiveSocketSet);
}
}
else
printf(" n In fcntl Else cond %d ", lFlag);
}
continue;
}

但是我的进程在 fcntl() 的其他条件下处于无限循环中。看起来 fcntl() 返回 0。

我想知道它在哪种情况下返回 0 以及如何处理这种情况。

更新:

if (Retval <= 0)可能会更改为if (Retval < 0)

Retval为零时,select运行正常。

Retval为 -1 且 errnoEBADF时,则使用 fcntl 检查 fd 是否有效。

你看了 fcntl 它总是返回 0,那是因为:

  1. 尚未设置 FD 的FD_CLOEXEC标志

  2. select不是失败,fcntl 也不会失败,因为所有 fd 都是有效的。


fcntl有很多种cmd。当使用F_GETFD时,它表示检索文件描述符标志。

查看fcntl手册,此类型中只有一个标志(FD_CLOEXEC)。因此,如果没有为 fd 设置此标志,则F_GETFD将返回值 0。

文件描述符标志

以下命令操作与文件描述符关联的标志。 目前,只定义了一个这样的标志:FD_CLOEXEC,关闭执行标志。 如果FD_CLOEXEC位为 0,则文件 描述符将在 execve(2) 中保持打开状态,否则将被关闭。

F_GETFD (void)
Read the file descriptor flags; arg is ignored.
F_SETFD (int)
Set the file descriptor flags to the value specified by arg.

什么时候不返回 0?

  1. open一个文件时,标志FD_CLOEXEC默认禁用。您可以像这样启用它。

    fd = open(filepath, O_RDONLY | O_CLOEXEC)
    
  2. 调用fcntl(fd, F_SETFD, FD_CLOEXEC)以启用标志FD_CLOEXEC

相关内容

  • 没有找到相关文章

最新更新