管道/ popen的跨平台轻量级包装

时间:2012-09-13 08:45:34

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

我不想创建另一个自行车并在管道/ popen下为C ++搜索轻量级(不是boost,poco,ace或其他库)crossplatform(win / lin)包装器。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

也许像

#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中使用它们。

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