C++ 中有没有类似的 popen

shouso888 2011-10-11 11:08:52
popen 是C的函数,返回 FILE* 指针, 实现执行一个命令 并 把 该命令的输出结果从定向到 FILE* 指向的文件里。

那 C++ 有没有相应的函数 ,实现 执行一个 linux 命令,并把输出结果 重定向到 一个 I/O 流。。就像 ifstream 打开文件

返回I/O 流?
...全文
507 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qq120848369 的回复:]
引用 6 楼 shouso888 的回复:
其实 能不能 还是 用 popen ,然后 把 FILE* 指向的pipe 用 C++ 中 I/O 流的形式 获取呢 ?


风险倒没有,可能你们老大没想到父进程可以wait子进程退出吧.

看你的意思就是想把C风格的I/O转成C++风格的I/O就是了.

fstream 有个接口叫open,需要传入文件路径.

我不是讲了如何让ps……
[/Quote]

文件名其实随意了,自己写死一个就行了,open时候O_CREAT|O_TRUNC|O_WRONLY,mode。
qq120848369 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shouso888 的回复:]
其实 能不能 还是 用 popen ,然后 把 FILE* 指向的pipe 用 C++ 中 I/O 流的形式 获取呢 ?
[/Quote]

风险倒没有,可能你们老大没想到父进程可以wait子进程退出吧.

看你的意思就是想把C风格的I/O转成C++风格的I/O就是了.

fstream 有个接口叫open,需要传入文件路径.

我不是讲了如何让ps输出到文件的方法了么,父进程wait返回之后,fstream打开文件来读就可以了.

文件名的生成可以利用getpid生成,在程序退出时unlink掉就可以了.

整个流程如下:

父进程open()PID命名的文件,unlink(PID命名文件);fork()子进程,dup2标准输出到PID文件,然后exec /bin/sh sh -c ps, 父进程wait子进程退出. wait返回后close PID文件, fstream打开PID文件,读文件即可. 程序结束前fstream.close()文件 。
shouso888 2011-10-12
  • 打赏
  • 举报
回复
其实 能不能 还是 用 popen ,然后 把 FILE* 指向的pipe 用 C++ 中 I/O 流的形式 获取呢 ?
shouso888 2011-10-12
  • 打赏
  • 举报
回复
对,你这个想法其实是我 还不知道 有 popen 这个函数时的解题思路。呵。

可惜被我老大毙了,他说这样干是有风险还是什么的。。让我好好想想,我找到了 popen ,他又说

最好可以用 C++ 的I/O 流实现。。。我就凌乱了。。。。。
qq120848369 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 shouso888 的回复:]
恩,先谢谢你的回复让我长了知识。

现在我是希望在程序里 执行 linux 的 ps 命令,然后 获取 输出的信息。原打算用

popen,在用fgets 获取信息 ,并解析这行信息。。现在我希望 能 用 C++ 的 函数 实现 以上相同功能,

就是能否有个函数 能实现 执行 ps 命令后 能 返回 I/O 流? 如ifstream s(文件),获取到 s ,再对 流 s

……
[/Quote]

在你的进程里想执行Ps命令需要一个额外的进程来执行PS,所以你离不开linux的接口,fork是必须的,另外想让一个已经编译过的可执行程序ps把输出打到方便获取的地方,你必须fork子进程之后dup2重定向标准输出之后再exec /bin/bash sh -c ps. 所以popen这种工作模式的确已经很完美了.

你只能模仿popen来做,但我觉得没法做到更好了,利用管道交互在父子进程间交互数据太方便了....

你可以让子进程把标准输出重定向到文件,然后父进程wait子进程退出,然后父进程就可以ifstream打开文件读数据,这可能更贴近你的想法.
shouso888 2011-10-11
  • 打赏
  • 举报
回复
恩,先谢谢你的回复让我长了知识。

现在我是希望在程序里 执行 linux 的 ps 命令,然后 获取 输出的信息。原打算用

popen,在用fgets 获取信息 ,并解析这行信息。。现在我希望 能 用 C++ 的 函数 实现 以上相同功能,

就是能否有个函数 能实现 执行 ps 命令后 能 返回 I/O 流? 如ifstream s(文件),获取到 s ,再对 流 s

进行解析。。
qq120848369 2011-10-11
  • 打赏
  • 举报
回复
popen是创建个Pipe,创建子进程,子进程dup2 STDOUT_FILENO 到 pipe[1],父进程fdopen(pipe[0])得到一个FILE*专门用来读pipe[0].

fdopen只不过给pipe[0]加上了缓冲,其他没什么.

另外,重定向dup2在标准C I/O库里也有对应, 叫freopen,意思就是把FILE*里边的文件描述符重定向到一个文件(这个文件先用Open打开获得一个描述符).

dup2的原理就是让一个描述符共享另一个描述符的文件表项.
shouso888 2011-10-11
  • 打赏
  • 举报
回复
请各位 大虾 多多指教

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧