c语言 - 无法将文件描述符设置为阻止模式



我正在努力编写最短的代码来使用阻塞文件描述符。

我设置了第一个:O_NONBLOCK
第二个:ICANON,[VMIN],[VTIME]作为我的文件描述符...

我需要设置哪些选项才能使用阻止文件描述符?

(示例.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("%sn",buff);
return 0;
}

您的代码仅修改未初始化的struct termios options变量的一部分。当你的代码调用tcsetattr时,大多数options变量将被设置为随机位,因此tcsetattr可能会返回错误或将虚假设置应用于终端。

由于您的代码仅显式修改某些终端设置,因此初始化options变量的最佳方法是使用调用tcgetattr将旧设置读入其中:

ret = tcgetattr(fd, &options);
if (ret < 0) {
perror("tcgetattr");
exit(1);
}
options.c_lflag &= ~ICANON;
options.c_cc[VMIN] = 2;
options.c_cc[VTIME] = 0;
ret = tcsetattr(fd, TCSANOW, &options);
if (ret < 0) {
perror("tcsetattr");
exit(1);
}

上面的代码示例假定文件描述符fd链接到终端,因此isatty(fd)返回 1。当fd链接到普通文件时,它根本不适用。

在您发布的代码中,fd链接到当前目录中名为"sample.txt"的文件,该文件不太可能是终端。 在这种情况下,tcgetattrtcsetattr调用将返回-1并将errno设置为ENOTTY

相关内容

  • 没有找到相关文章

最新更新