2011-09-04 114 views
2

请问您可以告诉我最好的方法吗?我可以使用popen,但每次需要启动我的应用程序时,为参数创建一个大型缓冲区是很必要的。我可以使用fork + execv,但是然后程序写入标准输出,我无法读取输出(显示在文本字段中)是否还有其他解决方案?从gui前端启动控制台应用程序

+1

我很确定参数缓冲区的创建不是这样的性能瓶颈。 –

+0

当然不是,但我的应用程序本身使用相当少量的内存和CPU。 –

+0

您可以创建一个管道,并仍然使用fork-exec:http://stackoverflow.com/questions/5953386/writing-to-child-process-file-descriptor –

回答

1

你能告诉我最好的方法吗?我可以使用popen,但每次需要启动我的应用程序时,为参数创建一个大型缓冲区是很必要的。

popen()是一个很好的标准的方式,如果你只需要与孩子申请单向通信,就像写其stdinstdout阅读,但不能同时使用。

使用C时,需要对字符串感到舒适。使用a string library for C来缓解字符串操作很有帮助,例如字符串连接,因为标准C库只提供基本的低级函数。

我可以用叉子+ execv,但随后的程序写入到stdout,我不能读取输出(在文本字段中显示它)

popen()给你一个FILE*指针孩子程序的stdout,您可以使用标准CI/O功能fread()fscanf()来读取其输出。再次,标准的C库has this functionality,并且它让你自己熟悉它。

有没有其他解决方案?

您可以让子程序写入一个文件然后读取该文件,但无论如何您需要能够构造命令行字符串并读取文件。

+0

_您可以使子程序写入文件,然后读取该文件,但无论如何,您需要能够构建命令行字符串并读取文件._ - 这是一个完全半分的解决方案。 “其他”解决方案是实现'popen'的基本功能 - 创建一个'pipe(2)',做一个'fork(2)',然后在子节点上执行'dup2(2)'在stdout上,写入管道的末端,最后是'execve(2)'。 –

+0

不知道是什么促使你的回应,我没有说不能做pipe-fork-exec。不过,您需要从'FILE *'或文件描述符中读取,这就是我能够读取文件的含义。 –

+0

谢谢Blagovest,这正是我需要的。马克西姆,我的编是太小,不能链接任何库,除了libc。 –

相关问题