UNIX'差异'在main.c中使用popen调用时返回不正确

时间:2015-10-07 17:42:18

标签: diff popen

我为一个涉及构建汇编程序的学校项目进行了一系列测试。

测试使用popen来捕获" make"和" ./汇编程序" - 这只是因为这些命令的输出不会占用测试套件的输出。

问题在于对popen的调用执行" diff"在自动测试套件中返回一个字符串,但不是在我手动调用它时。

这是测试套件代码:

char buf1[256];
  FILE* make;
  FILE* assemble;
  FILE *diff;

  make = popen("make", "r");
  assemble = popen("./assembler input/simple.s inter.txt out.txt", "r");
  diff = popen("diff inter.txt out/ref/simple_ref.int", "r");
  fgets(buf1, sizeof(buf1), diff);
  printf("\nafter fgets simple -- strlen(buf) is %d\t buf is %s\n", strlen(buf1), buf1);

这是测试套件输出的与上述代码对应的部分:

after fgets simple -- strlen(buf) is 8   buf is 1,7c1,6

这是手动调用时的一系列命令:

aweeeezy  ⋯  make
  rm -f *.o assembler test-assembler core
  gcc -g -std=gnu99 -Wall -o assembler assembler.c src/utils.c src/tables.c src/translate_utils.c src/translate.c
aweeeezy  ⋯  ./assembler input/simple.s inter.txt out.txt
  Running pass one: input/simple.s -> inter.txt
  Running pass two: inter.txt -> out.txt
  Assembly operation completed successfully.
aweeeezy  ⋯  diff inter.txt out/ref/simple_ref.int
aweeeezy  ⋯  

1 个答案:

答案 0 :(得分:1)

当您使用popen()时,您将启动与您的程序同时运行的子进程。在您显示的代码片段中,子进程将在没有协调的情况下同时运行。

要复制命令行行为,您需要等到每个子进程完成;也就是说,在移动到流程的下一个阶段之前调用pclose()。例如,检查" Pipes the easy way!"在http://www.tldp.org/LDP/lpg/node12.html