抓取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道。 然后,您必须使用dupdup2standard 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; }