Unix 如何解决命名管道的问题?

Unix 如何解决命名管道的问题?,unix,shell,named-pipes,svm,Unix,Shell,Named Pipes,Svm,我有一个二进制程序*它接受提供的文件的内容,处理它,并通过标准输出将结果打印在屏幕上。对于自动化脚本,我希望使用命名管道将数据发送到此程序并自己处理输出。在尝试让脚本工作后,我意识到二进制程序从命名管道接收数据时存在问题。为了说明这个问题,我概述了几个使用unixshell的测试 通过处理一个实际的数据文件,很容易证明该程序是有效的 $ binprog file.txt > output.txt 这将导致output.txt包含file.txt中的已处理信息 命名管道(pipe.txt)

我有一个二进制程序*它接受提供的文件的内容,处理它,并通过标准输出将结果打印在屏幕上。对于自动化脚本,我希望使用命名管道将数据发送到此程序并自己处理输出。在尝试让脚本工作后,我意识到二进制程序从命名管道接收数据时存在问题。为了说明这个问题,我概述了几个使用unixshell的测试

  • 通过处理一个实际的数据文件,很容易证明该程序是有效的

    $ binprog file.txt > output.txt
    
    这将导致output.txt包含file.txt中的已处理信息

  • 命名管道(pipe.txt)的工作原理如本演示所示

    $ cat pipe.txt > output.txt
    $ cat file.txt > pipe.txt
    
    这将导致output.txt在通过管道发送后包含file.txt中的数据

  • 当二进制程序从命名管道而不是文件中读取时,事情就不能正常工作

    $ binprog pipe.txt > output.txt
    $ cat file.txt > pipe.txt
    
    在这种情况下,output.txt即使在cat和binprog终止后也不包含任何数据。使用top和ps,我可以看到binprog正在“运行”,似乎正在工作。一切都会执行,没有错误

  • 在第三个示例中,为什么binprog没有生成输出?

    我可以试着做些什么来让它工作


    [*]所讨论的程序是svm规模。我选择对示例进行概括,以保持其简洁明了。

    binprog是否也接受stdin上的输入?如果是这样,这可能对你有用

    cat pipe.txt | binprog > output.txt
    cat file.txt > pipe.txt
    
    编辑:简要扫描手册页,查看svm比例。试试这个:

    cat pipe.txt | svm-scale - > output.txt
    

    binprog是否也接受标准输入?如果是这样,这可能对你有用

    cat pipe.txt | binprog > output.txt
    cat file.txt > pipe.txt
    
    编辑:简要扫描手册页,查看svm比例。试试这个:

    cat pipe.txt | svm-scale - > output.txt
    

    你确定这个程序可以使用管道吗?如果它需要随机访问输入文件,它将无法工作。每当程序试图在输入文件中查找时,都会出现错误

    如果您知道该程序是为处理管道而设计的,并且您正在使用bash,那么可以使用进程替换来避免显式创建命名管道

    binprog <(cat file.txt) > output.txt
    
    binprog output.txt
    
    您确定该程序可以使用管道吗?如果它需要随机访问输入文件,它将无法工作。每当程序试图在输入文件中查找时,都会出现错误

    如果您知道该程序是为处理管道而设计的,并且您正在使用bash,那么可以使用进程替换来避免显式创建命名管道

    binprog <(cat file.txt) > output.txt
    
    binprog output.txt
    
    如果
    binprog
    不能很好地使用终端以外的任何东西作为输入,可能需要为其输入提供一个(伪)终端(pty)。这很难组织,但是
    expect
    程序是相对容易做到这一点的一种方法。与pty公司就编程进行了讨论 作者:W理查德·史蒂文斯和斯蒂芬·阿拉戈,作者:马克·J·罗金德

    还需要查看
    truss
    strace
    或本地等效对象的输出。这些程序记录进程进行的所有系统调用。在Solaris上,我会运行:

    truss -o binprog.truss binprog
    

    以交互方式,并查看它的功能。然后我会尝试使用I/o重定向,然后使用来自命名管道的I/o重定向;这两者之间可能存在一些显著的差异,或者您可能会看到挂起的系统调用。如果在truss日志文件中看到forks,则需要添加“
    -f
    ”标志以跟随子项。

    如果
    binprog
    不能很好地使用终端以外的任何东西作为输入,则可能需要为其输入提供一个(伪)终端(pty)。这很难组织,但是
    expect
    程序是相对容易做到这一点的一种方法。与pty公司就编程进行了讨论 作者:W理查德·史蒂文斯和斯蒂芬·阿拉戈,作者:马克·J·罗金德

    还需要查看
    truss
    strace
    或本地等效对象的输出。这些程序记录进程进行的所有系统调用。在Solaris上,我会运行:

    truss -o binprog.truss binprog
    

    以交互方式,并查看它的功能。然后我会尝试使用I/o重定向,然后使用来自命名管道的I/o重定向;这两者之间可能存在一些显著的差异,或者您可能会看到挂起的系统调用。如果在truss日志文件中看到forks,则需要添加“
    -f
    ”标志以跟随子项。

    否,它不接受stdin的输入。在我的手册页中没有类似的内容,我试过了,但它不起作用。不,它不接受stdin的输入。在我的手册页中没有类似的内容,我无论如何都尝试过,但它不起作用。我非常确定它应该与管道一起工作,即使在执行之后,它也不会产生任何错误,也不会崩溃。替换的想法很有趣,但最终对我的脚本不起作用。我非常确定它应该与管道一起工作,即使在它执行之后,也不会产生任何错误,也不会崩溃。替换的想法很有趣,但最终对我的脚本不起作用。如果在开始写入命名管道之前启动binprog,那么当binprog read()s“file”(pipe.txt)时,它可能会输出零字节,而不考虑实际的错误代码,只会退出。如果在binprog之前运行cat会发生什么?Antti.huima,我尝试先启动将数据导入管道的进程,然后再启动binprog进程,结果没有什么区别——发生了完全相同的事情。难道不需要在后台运行“cat pipe.txt>output.txt”吗?与“binprog”类似,如果在开始写入命名管道之前启动binprog,则当binprog read()读取“文件”(pipe.txt)时,它可能会输出零字节,而不考虑实际错误代码,只会退出。如果在binprog?Antti.huima之前运行cat,会发生什么情况?我尝试启动一个进程,首先将数据导入管道,然后