【问题标题】:Crossplatform lightweight wrapper for pipe/popen用于管道/popen 的跨平台轻量级包装器
【发布时间】:2012-09-13 08:45:34
【问题描述】:

我不想创建另一辆自行车并在 C++ 的 pipe/popen 下搜索轻量级(不是 boost、poco、ace 或其他库)跨平台(win/lin)包装器。有什么建议吗?

【问题讨论】:

    标签: c++ cross-platform pipe wrapper popen


    【解决方案1】:

    可能是这样的

    #ifndef _WIN32
    inline int _pipe(int fildes[2], unsigned psize, int textmode) {
       return pipe(fildes);
    }
    inline FILE* _popen(const char* command, const char* type) {
       return popen(command, type);
    }
    inline void _pclose(FILE* file) { 
       pclose(file); 
    }
    #endif
    

    MSDN 说 CRT 中提供了 _popen_pclose_pipe。所以我们只是将带下划线的函数转发到 Windows 之外的真正的 POSIX 函数(你可以做相反的事情,但请注意 _pipe 需要 2 个额外的参数,这在 Windows 中是有意义的)。

                          ___________
                         /           \ 
                        |  Warning !  |
                         \___________/
                               |
     -------- __@      __@     | __@       __@      __~@
     ----- _`\<,_    _`\<,_    _`\<,_     _`\<,_    _`\<,_
     ---- (*)/ (*)  (*)/ (*)  (*)/ (*)  (*)/ (*)  (*)/ (*)
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    1. 这些函数只能在控制台程序中使用。它在 Windows GUI 程序中不起作用。有关详细信息,请参阅 _popen 的 MSDN 页面中的注释,另请参阅What is the equivalent to Posix popen() in the Win32 API?

    2. 你知道 popen 在 shell 中执行命令吗? UNIX shell 和 Windows 命令提示符之间的语法有很大的不同,这些无法通过 pope/pclose 的一些跨平台实现来解决。

    3. Windows 函数与未使用这些简单包装器处理的真正 POSIX 函数之间可能存在一些细微差别。

    4. 您不能在 WinRT 中使用它们。

    (自行车是从http://www.chris.com/ascii/index.php?art=transportation%2Fbicycles复制的。)

    【讨论】:

    • 是的,这是最简单的 C 方式。我发现了一些具有重定向输出功能、错误处理等的现代 C++ 实现。我想创建易于使用的机制来在单独的进程中运行任何语句(因为语句会破坏应用程序)并分析输出和返回代码。在做之前,我想环顾四周。
    • @Torsten:那会是什么实现?可以链接吗?
    • @suluke 对不起,我很困惑:p。
    • @Stargateur 对我来说是另一个莫名其妙的编辑拒绝。我可能应该停止尝试完全改进答案。也许@kennytm 仍然想编辑他们的答案,让_pclosepclose 返回int 值,以便可以用它检查返回值?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2016-05-11
    • 2016-08-26
    相关资源
    最近更新 更多