我正在開發一個使用execvp執行程序的程序。它需要捕獲子進程的結果並在主進程中解析它們。似乎有一種方法,使用命名管道和複製。我試圖尋找一個很好的例子,但迄今沒有運氣。如果任何人有任何關於此的指針,鏈接和/或建議,我將不勝感激。如何捕獲execvp的輸出
2
A
回答
5
您不需要命名管道;無名管道工作得很好。實際上,您經常可以自己使用popen
而不是自己做pipe
/fork
/dup
/exec
。 popen
是這樣的(雖然你libc
的實現可能有更多的錯誤檢查):
FILE *popen(const char *command, const char *type) {
int fds[2];
const char *argv[4] = {"/bin/sh", "-c", command};
pipe(fds);
if (fork() == 0) {
close(fds[0]);
dup2(type[0] == 'r' ? 0 : 1, fds[1]);
close(fds[1]);
execvp(argv[0], argv);
exit(-1);
}
close(fds[1]);
return fdopen(fds[0], type);
}
這將創建一個未命名的管道,並fork
秒。在孩子中,它將stdout(或stdin)重新附加到管道的一端,然後exec
是孩子。父母可以簡單地從管道的另一端讀取(或寫入)。
+0
大。我已經回顧了管道是如何工作的,而且這應該是訣竅。 – 2009-04-18 01:41:37
2
難道你只是使用popen()?
0
下面是一個簡單的例子,演示了使用popen實現您的目標。只要把東西比「回聲」更有意思的命令:)
#include <stdio.h>
int main()
{
char buf[100];
int i = 0;
FILE *p = popen("echo \"Test\"","r");
if (p != NULL)
{
while (!feof(p) && (i < 99))
{
fread(&buf[i++],1,1,p);
}
buf[i] = 0;
printf("%s",buf);
pclose(p);
return 0;
}
else
{
return -1;
}
}
相關問題
- 1. 如何捕獲輸出?
- 2. 如何捕獲GroovyShell輸出?
- 3. 如何在單行上輸出execvp?
- 4. Powershell:如何捕獲主機的輸出
- 5. 如何捕獲clojure的標準輸出?
- 6. 如何捕獲系統的輸出()
- 7. 如何捕獲輸出的Java
- 8. 如何捕獲Windows cmd shell的輸出?
- 9. execvp/fork - 如何捕獲不成功的執行?
- 10. 捕獲FFMPEG輸出
- 11. pexpect捕獲輸出
- 12. Powershell:如何捕獲PowerShell輸出
- 13. 如何從shell命令捕獲輸出?
- 14. 如何捕獲PHP輸出到變量
- 15. 如何捕獲dvdauthor輸出到文件
- 16. 如何在rails中捕獲ffmpeg輸出?
- 17. 如何從CakePHP Shell捕獲輸出
- 18. 如何捕獲流輸出Python從subprocess.communicate()
- 19. Vagrant插件:如何捕獲machine.action輸出
- 20. 如何捕獲RCurl詳細輸出
- 21. 如何在PHP中捕獲捕獲子進程輸出
- 22. 捕獲SysLogHandler的輸出
- 23. install.packages的捕獲輸出
- 24. LINQPad的捕獲輸出
- 25. 捕獲的bash輸出
- 26. execvp,ls的輸出重定向
- 27. 如何捕獲Zend視圖輸出而不是實際輸出
- 28. 如何在C#/ .NET中捕獲二進制輸出輸出
- 29. 從NodeJS捕獲輸出輸出
- 30. 捕獲MS SQL輸出
相關:[get命令的輸出管道,C爲Linux(http://stackoverflow.com/questions/219138/) – ephemient 2009-04-17 21:32:45