read()和write()向Vim发送多余的输出

时间:2014-08-18 14:17:02

标签: c vim stdout stdin system-calls

我正在使用read()write()系统调用来获取stdin的输入并将其打印回stdout

从Vim内部我执行命令来运行我的程序

:!./lowio

然后打印出缓冲区数组,但是没有放入我的数组的丢弃的字符被发送到Vim。然后,Vim将这些字符作为一个命令插入。

#include <unistd.h>
#define BUFSIZE 3

int main()
{
  char low[BUFSIZE + 1];
  read(0, low, BUFSIZE);
  low[BUFSIZE + 1] = '\0';
  write(1, low, BUFSIZE);

 return 0;
}

例如,输入

abcdG

abc打印到stdin,但会将dG发送到Vim,Vim会从光标移到文件的末尾。

这里发生了什么?

1 个答案:

答案 0 :(得分:3)

您的stdin是您的终端(/dev/tty)并且您输入了abcdG<NL>。您的read(0,...,3)呼叫仅从终端设备驱动程序的缓冲区请求了3个字符(abc)。剩余的字符保留在缓冲区中。然后,当您将控制权返回给vim时,它继续从stdin读取并获取剩余的缓冲字符。