【发布时间】:2019-09-26 14:03:40
【问题描述】:
我正在尝试编写最短的代码来获得阻塞文件描述符。
我先设置:O_NONBLOCK
第二:我的文件描述符的 ICANON、[VMIN]、[VTIME]...
我还需要设置哪些选项来设置阻塞文件描述符?
(sample.txt 是空的 & open() 不同的模式没有任何机会)
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
void set_blocking(int fd, int blocking) {
int flags = fcntl(fd, F_GETFL, 0);
if (blocking)
flags &= ~O_NONBLOCK;
else
flags |= O_NONBLOCK;
fcntl(fd, F_SETFL, flags);
return;
}
int main(){
int fd;
char buff[100];
struct termios options;
options.c_lflag &= ~ICANON;
options.c_cc[VMIN] = 2;
options.c_cc[VTIME] = 0;
fd = open("sample.txt",O_RDWR);
tcsetattr(fd, TCSANOW, &options);
set_blocking(fd,1);
read(fd,buff,2);
printf("%s\n",buff);
return 0;
}
【问题讨论】:
-
推荐使用
fcntl()获取并保存原始终端设置,以便您可以在退出前恢复它们。并修改它们,而不是从头开始设置。 -
tcsetattr仅适用于特殊终端设备文件,不适用于普通文件。我怀疑你的“sample.txt”是一个终端。 -
您不检查任何系统调用的错误返回。如果您想知道为什么系统调用无法按预期工作,您必须诊断错误返回。至少使用
perror来显示错误原因。请在在此处发布之前执行此操作。 -
在我删除有关终端和终端选项的代码后,(因为据我所知,我不需要它们)代码仍然不等待空的 sample.txt 这是普通的文本文件。如果我有一个简约的示例代码,它在调用普通文本文件时具有等待读取功能,我将不胜感激。
标签: c linux file-descriptor termios