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
我对涉及构建汇编程序的学校项目进行了一系列测试。
测试使用 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