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