我为一个涉及构建汇编程序的学校项目进行了一系列测试。
测试使用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 ⋯
答案 0 :(得分:1)
当您使用popen()时,您将启动与您的程序同时运行的子进程。在您显示的代码片段中,子进程将在没有协调的情况下同时运行。
要复制命令行行为,您需要等到每个子进程完成;也就是说,在移动到流程的下一个阶段之前调用pclose()。例如,检查" Pipes the easy way!"在http://www.tldp.org/LDP/lpg/node12.html