抓取exec的输出
所以即时通讯设法写一些需要抓住命令输出的东西,然后虐待,然后将其传递给另一个程序。
但即时通讯有一个问题,我不能解决如何得到命令输出,并将其存储下面是我有什么样的
if(fork() == 0){ execl("/bin/ls", "ls", "-1", (char *)0); /* hopefully do something with the output here*/ }else{ *other stuff goes here* }`
所以基本上我不知道是否有任何方法我可以从“execl”得到的输出,并将其传递给其他东西(例如通过存储在某种缓冲区)。
任何build议将是伟大的。 谢谢你们
您必须使用pipe()
从父进程到subprocess创build一个pipe道。 然后,您必须使用dup
或dup2
将standard ouput
(STDOUT_FILENO)和error output
(STDERR_FILENO) dup2
到pipe道,并在父进程中从pipe道读取。 它应该工作。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #define die(e) do { fprintf(stderr, "%s\n", e); exit(EXIT_FAILURE); } while (0); int main() { int link[2]; pid_t pid; char foo[4096]; if (pipe(link)==-1) die("pipe"); if ((pid = fork()) == -1) die("fork"); if(pid == 0) { dup2 (link[1], STDOUT_FILENO); close(link[0]); close(link[1]); execl("/bin/ls", "ls", "-1", (char *)0); die("execl"); } else { close(link[1]); int nbytes = read(link[0], foo, sizeof(foo)); printf("Output: (%.*s)\n", nbytes, foo); wait(NULL); } return 0; }
打开一个pipe道,并更改stdout以匹配该pipe道。
#include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int pipes[2]; pipe(pipes); // Create the pipes dup2(pipe[1],1); // Set the pipe up to standard output
之后,任何去标准输出(如通过printf),出来pipe [0]。
FILE *input = fdopen(pipe[0],"r");
现在你可以像普通文件描述符那样读取输出了。 有关更多详细信息,请看这个
感谢Jonathan Leffler,我优化了上面的代码,因为它无法读取所有响应一次。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/wait.h> #define die(e) do { fprintf(stderr, "%s\n", e); exit(EXIT_FAILURE); } while (0); int main() { int link[2]; pid_t pid; char foo[4096 + 1]; memset(foo, 0, 4096); if (pipe(link)==-1) die("pipe"); if ((pid = fork()) == -1) die("fork"); if(pid == 0) { dup2 (link[1], STDOUT_FILENO); close(link[0]); close(link[1]); execl("/bin/ls", "ls", "-1", (char *)0); die("execl"); } else { close(link[1]); int nbytes = 0; std::string totalStr; while(0 != (nbytes = read(link[0], foo, sizeof(foo)))) { totalStr = totalStr + foo; printf("Output: (%.*s)\n", nbytes, foo); memset(foo, 0, 4096); } wait(NULL); } return 0; }