我正在Linux中开始串行端口编程。在阅读了网络上的几个示例之后,我不了解fcntl(fd, F_SETFL, 0)的确切效果?它正在清除位,但是它会影响哪些标志?它设置和/或清除了什么?

最佳答案

一对一

1)使用的函数调用
fcntl()-它对传入参数中的文件描述符执行操作。

2)通话中的第二个参数

F_SETFL(int)



3)通话中的第三个参数

为0表示,将file status flag设置为零。
正如Jean-BaptisteYunès所说。



所以最后

fcntl(fd, F_SETFL, 0)

此调用会将打开的文件描述符的file status标志设置为值0。

但是理想情况下,我们不应该更改文件状态标志。
最好的方法是先使用F_GETFL获取当前文件状态标志,然后在其中更改所需的位。
参见示例:

如果要修改文件状态标志,则应使用F_GETFL获取当前标志并修改该值。不要以为这里列出的标志是唯一实现的标志;您的程序可能会从现在开始运行数年,然后可能会存在更多标志。例如,这是一个设置或清除标志O_NONBLOCK而不更改任何其他标志的函数:
/* Set the O_NONBLOCK flag of desc if value is nonzero,
   or clear the flag if value is 0.
   Return 0 on success, or -1 on error with errno set. */

int
set_nonblock_flag (int desc, int value)
{
  int oldflags = fcntl (desc, F_GETFL, 0);
  /* If reading the flags failed, return error indication now. */
  if (oldflags == -1)
    return -1;
  /* Set just the flag we want to set. */
  if (value != 0)
    oldflags |= O_NONBLOCK;
  else
    oldflags &= ~O_NONBLOCK;
  /* Store modified flag word in the descriptor. */
  return fcntl (desc, F_SETFL, oldflags);
}

10-04 17:53