我正在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);
}