【问题标题】:c execute external program multiple timesc 多次执行外部程序
【发布时间】:2015-03-21 10:26:02
【问题描述】:

我正在尝试使用一些参数从我的代码中调用一个外部程序。当我试图查看不同的参数如何改变它的输出时,我必须多次运行它(大约 1000 次)。每次外部程序运行时,我只对其输出的一行感兴趣,尽管它正在打印很多(出于我的目的)无用的东西。我感兴趣的行就在输出中的特殊标识符(“some_signal”)的正上方。所以我想我会等到这条线出现并阅读上面的线。

我尝试了以下方法:

 pid_t pid = 0;
  int pipefd[2];
  FILE* output;
  char line[256];               // pipe read buffer
  char prev_line[256];          // prev. line pipe buffer
  char signal[] = "some_signal\n";
  int status = 0;
  double obj_Val;

  pipe (pipefd); //create pipe
  pid = fork (); //span child process
  if (pid == 0)
    {
      // redirect child's output to pipe
      close (pipefd[0]);
      dup2 (pipefd[1], STDOUT_FILENO);
      dup2 (pipefd[1], STDERR_FILENO);
      execl ("/some/path",
         "some/path",
         "some_argument", (char*) NULL);
    }
  else if (pid < (pid_t) 0)
    {
      printf("fork failed \n");
      return EXIT_FAILURE;
    }
  else
    {
      // get child output to pipe
      close (pipefd[1]);
      output = fdopen (pipefd[0], "r");


      while (fgets (line, sizeof(line), output), signal != NULL)
        {
          if(strcmp(line, signal) == 0)
           {
             obj_Val = atof (prev_line);
             kill (pid, SIGTERM);
             waitpid (pid, &status, WNOHANG);
             kill (pid, SIGKILL);
             waitpid (pid, &status, 0);
             break;
           }//end if
          strcpy (prev_line, line);
        }//end while
     }

这适用于大约 100 次运行,然后出现二分之一的错误。第一个是分段错误。第二个是调用程序打印出被调用程序的所有输出(没有包含所需信号的行)并进入无限循环(我的猜测是,因为信号丢失,while循环不会终止)。 也许有人可以提供提示或链接在哪里寻找和寻找什么,或者最好告诉我我做错了什么。

【问题讨论】:

    标签: c pipe system


    【解决方案1】:

    您的while 条件被破坏:signal != NULL 始终为真,因为signal 是一个数组;由于逗号 , 运算符,整个条件始终为真。

    由于以下原因,您没有检查 fgets 的返回值,这意味着没有读取任何内容并且缓冲区未初始化。

    在您第一次对其执行atof 之前,prev_line 也不会被初始化。


    无论如何,用-Wall -Werror 编译并修复剩余的错误。

    【讨论】:

    • 好的,谢谢。所以那部分有效。但现在似乎过了一段时间,创建的进程需要越来越多的时间才能关闭。可能是什么原因?
    • 请提出一个新问题
    最近更新 更多