我目前正在研究如何将stream水线pipe理到shell中。 例如,在我的shell中,如果我input“ls | wc | less”。 这个操作的结果将是创build三个进程,ls wc和less。 ls的输出将被input到wc的inputinput中,并且wc的输出将被input到input的input中。
对我来说,这意味着在执行“ls | wc | less”时。 less的标准input不是键盘,而是wc的输出。 但是,less一些仍然会响应我的键盘。 为什么? 我不明白,因为对我来说,由于它已经被pipe道,所以对键盘不太敏感。
有人有一个想法吗? 谢谢
代码从少
#if HAVE_DUP /* * Force standard input to be the user's terminal * (the normal standard input), even if less's standard input * is coming from a pipe. */ inp = dup(0); close(0); #if OS2 /* The __open() system call translates "/dev/tty" to "con". */ if (__open("/dev/tty", OPEN_READ) < 0) #else if (open("/dev/tty", OPEN_READ) < 0) #endif dup(inp); #endif
它从/ dev / tty打开一个直接的流,以及你的stdin是什么。
只是一个猜测 – 打开/dev/console
的交互式会话,我用了一次伎俩。 我错了 – strace
是你的朋友:-):
echo | strace less ) = 16 read(0, "\n", 8192) = 1 write(1, "\n", 1 ) = 1 read(0, "", 8191) = 0 write(1, "\33[7m(END)\33[27m\33[K", 17(END)) = 17 read(3,
正如你所看到的,更少的是从FD 3中读取。
/* Standard file descriptors. */ #define STDIN_FILENO 0 /* Standard input. */ #define STDOUT_FILENO 1 /* Standard output. */ #define STDERR_FILENO 2 /* Standard error output. */
仔细一看('q'后)显示:
open("/dev/tty", O_RDONLY) = 3
这证实@ 123的源代码检查 – 它打开/dev/tty
。