当我使用反引号启动程序时,
cat `./my_program`
我希望我的read()可以逐个字符地读取字符,但仍逐行读取。我的终端机的非规范模式不起作用。我不太明白为什么。
这是我的代码:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <term.h>
#include <strings.h>
int main()
{
struct termios term_setting;
char *term;
char buff[10];
term = getenv("TERM");
tgetent(NULL, term);
tcgetattr(STDOUT_FILENO, &term_setting); //
term_setting.c_lflag &= ~(ICANON | ECHO); //set my term in echo and non-canonique mode
tcsetattr(STDOUT_FILENO, 0, &term_setting); //
for (;;){
bzero(buff, sizeof(char) * 10);
read(STDIN_FILENO, buff, 9);
printf("%s\n", buff);
}
return (0);
}
答案 0 :(得分:2)
这里似乎有些混乱:您期望什么
cat `./my_program`
生产?
my_program
会无限循环地将标准输入复制到标准输出中,即使到达了您未测试的文件末尾,也会产生意外的输出。
shell可以通过文件,伪终端或可能通过管道的方式收集此输出,并在完成后将其作为命令行参数传递给cat
,但是由于您必须杀死{{1} }为了完成其输出,shell也会中止该操作。
my_program
期望选项和文件名作为命令行参数,可能不是您键入的内容。
关于更改终端设置,您可以使用cat
或仅使用STDIN_FILENO
代替0
,因为您想更改输入手柄的行为。
答案 1 :(得分:1)
Ry-♦在评论中说:
Because stdout isn’t the terminal anymore. Did you mean to get/set those attributes on STDIN_FILENO?
正是我的问题,谢谢!