UNIX 'diff' returns 在 main.c 中使用 popen 调用时不正确

UNIX 'diff' returns improperly when called using popen in main.c

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

测试使用 popen 来捕获 "make" 和“./assembler”的输出——这只是为了让这些命令的输出不会挤占测试套件的输出。

问题是对 popen 的调用执行了 "diff" returns 自动测试套件中的一个字符串,但当我手动调用它时却没有。

这是测试套件代码:

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  ⋯  

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

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