实施" tee"没有留下内核空间

时间:2016-06-15 05:01:08

标签: c windows splice tee

在Linux中,tee命令将数据从stdin复制到stdout和文件中;通过利用teesplice系统调用,可以实现此功能,而数据不会离开内核空间。在没有数据离开内核空间的情况下,在Windows上实现tee命令需要哪些函数?

虽然tee命令有一个简单的实现,readopenwrite复制用户空间中的数据,但我对学习特别感兴趣如何在没有数据离开内核空间的情况下拆分文件流。

2 个答案:

答案 0 :(得分:2)

这个问题的前提是错误的。 tee命令不依赖于tee()splice()系统调用,也不是零拷贝;它基本上实现为:

open file for writing;
while (read some data from stdin) {
    write the data to stdout;
    write the data to the file;
}

涉及的唯一系统调用是open()read()write(),这些调用的Windows版本与UNIX版本基本相同。

答案 1 :(得分:1)

Windows中没有内置此类功能,但原则上应该可以编写类似tee的内核模式设备驱动程序。当然,它仍然可以像用户模式实现一样基本:从源接收数据,将其写入目标。您将能够接收发送到T型设备的输出数据,而不是发出读取操作,这样做效率更高,并且您可以避免一些用户/内核模式转换,但即使如此,我也可以#&# 39;我不确定你能获得多少性能提升。

我的猜测是,它可能不值得付出努力,但也许有边缘情况。

我也不确定内核驱动程序是否可以处理旧版Windows中的控制台I / O,因为它使用的是psuedo-handle而不是真正的句柄。但是控制台I / O很慢,所以如果你的任何端点都是控制台,你也可以坚持用户模式实现 - 这绝对不会成为这种情况下的瓶颈。

也应该可以使用类似拼接的内核模式设备驱动程序。这个可能与用户模式版本完全相同,虽然API略有不同。

在任何一种情况下,使用内核模式驱动程序都可能更容易有效地处理来自不同进程的大量同时发球和/或拼接。在用户模式下,您可能会为每个线程使用单独的线程,甚至是单独的进程。