非规范模式不适用于反引号

时间:2019-06-30 21:02:21

标签: c

当我使用反引号启动程序时,

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);
}

2 个答案:

答案 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? 正是我的问题,谢谢!