为什么fcntl(fd,F_SETFL,0)用于串口编程

我正在Linux中启动串口编程.在网上看了几个例子后,我不明白fcntl(fd,F_SETFL,0)的确切效果?它正在清除位,但它会影响哪些标志?它设定或清楚了什么?

解决方法:

一个接一个

1)使用的函数调用

fcntl() – 它对参数中传递的文件描述符执行操作.

2)电话中的第二个参数

F_SETFL(int)

Set the file status flags to the value specified by arg. File access
mode (O_RDONLY, O_WRONLY, O_RDWR) and file creation flags (i.e.,
O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC) in arg are ignored. On Linux this
command can change only the O_APPEND, O_ASYNC, O_DIRECT, O_NOATIME,
and O_NONBLOCK flags.

3)通话中的第3个参数

它是0表示,它将file status flag设置为零.
正如Jean-BaptisteYunès在评论中所说.

file access mode and file creation flags are ignored. This command
reset every other flags: no append, no async, no direct, no atime, and
no nonblocking

最后

fcntl(fd, F_SETFL, 0)

此调用将打开的文件desciptor的文件状态标志设置为值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);
}
上一篇:linuxC文件以及目录操作函数


下一篇:fcntl函数学习