Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从C/C+;读取管道的最快方法+;节目?_C++_Linux_Shell_Unix_Pipe - Fatal编程技术网

C++ 从C/C+;读取管道的最快方法+;节目?

C++ 从C/C+;读取管道的最快方法+;节目?,c++,linux,shell,unix,pipe,C++,Linux,Shell,Unix,Pipe,如果我想在Linux上通过管道将字节数据传输到C/C++程序,如下所示: cat my|u文件|/my|u应用程序 但是: 我们不能假设管道数据将来自文件 我们希望将数据解释为文件中的字节(而不是字符串) 从C/C++应用程序读取管道的最快技术是什么 我做了一些研究,发现: read() std::cin.read() popen() 但我不确定是否有更好的方法,或者上面哪种方法更好 编辑:在这方面有一个性能要求,因此我要求使用开销最小的技术。当您这样导入数据时,管道输入是标准输入。就像普通

如果我想在Linux上通过管道将字节数据传输到C/C++程序,如下所示:

cat my|u文件|/my|u应用程序

但是:

  • 我们不能假设管道数据将来自文件
  • 我们希望将数据解释为文件中的字节(而不是字符串)
  • 从C/C++应用程序读取管道的最快技术是什么

    我做了一些研究,发现:

    • read()
    • std::cin.read()
    • popen()
    但我不确定是否有更好的方法,或者上面哪种方法更好


    编辑:在这方面有一个性能要求,因此我要求使用开销最小的技术。

    当您这样导入数据时,管道输入是标准输入。就像普通的控制台程序一样,只需读取cin(或stdin)

    只需使用
    std::cin.read()
    。没有理由处理
    popen()
    或类似的问题


    只是想澄清一下。。。没有特定于管道的方式来读取输入。就你的计划而言,有cin,就这样

    这个问题可能会在速度方面帮助你。。。

    您为什么那么关心性能? 来自
    /dev/uradom
    的1G字节可以在1分钟内通过管道传输到
    wc
    (并且
    wc
    在15%的时间内运行,等待其余时间的数据)!只要试试时间(head-1000000000c/dev/uradom|wc)

    但最快的方法是使用具有相当大缓冲区(例如64KB到256KB)的系统调用

    当然,请阅读并仔细阅读相关的
    man
    页面

    研究灵感的源代码。它们都是项目,因此请随时为它们做出贡献并加以改进

    但我敢打赌,在实践中使用
    popen
    ,或
    stdin
    ,或读取
    std::cin
    不会增加太多开销

    您还可以使用增加stdio缓冲区

    另见

    (如果从stdin读取,则文件描述符为
    stdin\u FILENO
    ,即0)

    你可能对

    您当然应该阅读和报告的文档

    您可以使用技术来优化性能。
    调查项目的进展情况。考虑加入其中一个。Read当然是ISBN 978-1-107-05713-5

    注意
    popen()
    不会从管道中读取任何内容,只会提供必要的文件描述符,您可以使用这些描述符调用
    Read()
    。而不是
    popen()
    。在C语言中,使用
    read()
    ;在C++中,可能是“代码> Read())/Cudio >,但是使用<代码> STD::CIN < /C>也会起作用。在shell中使用
    |
    并读取
    std::cin
    将非常好、灵活和健壮。仅供参考,
    cat my_file./my_app
    /my_app@CharlesDuffy慢只是我的误解,认为有两种方法,一种更快…这必须在编写时考虑到高性能-这就是为什么我问什么是开销最小的方法?最小化开销非常依赖于具体情况——有时标准库提供的缓冲有助于解决问题,有时会带来伤害。我不知道你能得到一个总是正确的通用答案;除了使用STD::CI::Read()之外,还有什么其他的可能要我去测试?嗯,代码> STD::CIN::()(代码)<代码>是C++方式。还有C标准库调用和操作系统系统调用的直接调用。您的操作系统和标准库通常会提供许多用于调优的标志。但是,除非您已经测量到足够多,知道自己有问题,并且知道是读取过程导致了问题,否则您为什么要从以下内容开始呢?:)我可以问一下,如何获取第二个参数的文件描述符?抱歉,最后一个问题-我将用您建议的系统调用read()替换我的std::cin.read()。然而,我也有一个while循环检查!std::cin.eof(),以便获取所有字节。要了解read()系统调用的全部好处,有没有一种方法可以替代while(!std::cin.eof())的检查?我不明白您为什么那么关心性能。但是请阅读
    阅读(2)
    的手册页。你的申请是什么?请编辑您的问题以说明更多信息。@user997112,对于同一个文件描述符,不要混合使用缓冲调用和非缓冲调用——如果您使用的是
    read()
    (非缓冲),则不应使用任何
    std::cin
    调用。