如何从excel命令捕获输出

时间:2009-11-21 20:13:21

标签: c linux subprocess

我正在使用execl函数从C运行Linux进程。例如:

int cmd_quem() { 
  int result; 
  result = fork();
  if(result < 0) {
    exit(-1);
  }

  if (result == 0) {
    execl("/usr/bin/who", "who", NULL);
    sleep(4); //checking if father is being polite 
    exit(1); 
  } 
  else { 
    // father's time
    wait();
  }

  return 0;
}

我在控制台上得到了在终端上做“谁”的结果。我想知道的是,是否有任何函数可以“捕获”命令的输出结果。我的意思是,如果无论如何都要抓住这个:

feuplive tty5         2009-11-21 18:20

who命令产生的行之一。

3 个答案:

答案 0 :(得分:5)

首先,execl不会返回,除非出现类似可执行文件的问题。 sleep(4)可能永远不会被执行。

关于重定向和获取输出,请查看Unix Programming FAQ。寻找 spawn_background_command

答案 1 :(得分:4)

要执行此操作,您需要打开管道。然后,将子项的stdout替换为管道的写入端,并从父管道的读取端读取。像这个代码的修改版本:

int cmd_quem(void) {
  int result;
  int pipefd[2];
  FILE *cmd_output;
  char buf[1024];
  int status;

  result = pipe(pipefd);
  if (result < 0) {
    perror("pipe");
    exit(-1);
  }

  result = fork();
  if(result < 0) {
    exit(-1);
  }

  if (result == 0) {
    dup2(pipefd[1], STDOUT_FILENO); /* Duplicate writing end to stdout */
    close(pipefd[0]);
    close(pipefd[1]);

    execl("/usr/bin/who", "who", NULL);
    _exit(1);
  }

  /* Parent process */
  close(pipefd[1]); /* Close writing end of pipe */

  cmd_output = fdopen(pipefd[0], "r");

  if (fgets(buf, sizeof buf, cmd_output)) {
    printf("Data from who command: %s\n", buf);
  } else {
    printf("No data received.\n");
  }

  wait(&status);
  printf("Child exit status = %d\n", status);

  return 0;
}

答案 2 :(得分:2)

exec()系列函数从常规可执行文件创建新的过程映像。此文件是可执行对象文件或解释器脚本。成功调用exec()函数没有返回,因为调用进程在功能上被新进程替换。

因此除非失败,否则永远不会执行exec()之后的任何代码。

如果要捕获shell命令的输出,则需要popen