【发布时间】:2015-02-28 01:58:49
【问题描述】:
我想我了解 fork() 的工作原理,但我在正文中只有一些语句执行。例如,在每个转换块中,所有 printf() 都将执行,但 png_count、gif_count 和 bmp_count 永远不会增加并保持为 0(如 child(x) 的 printf() 输出所示);
/* Create Processes */
printf("\n+++++++++++CREATING PROCESSES+++++++++++\n");
int i, pid;
png_count = 0;
gif_count = 0;
bmp_count = 0;
for(i = 0; i < convert_count; i++) {
pid = fork();
if(pid < 0) {
printf("Error: fork failed");
exit(1);
}
else if (pid == 0) {
/* Child execution */
/* PNG conversion */
if ((getpid() % 2) == 0) {
image_in_path = getInPath(input_dir, png_images[png_count]);
image_out_path = getOutPath(output_dir, png_images[png_count]);
printf("image_in_path: %s\n", image_in_path);
printf("Child (%d): %d\n", png_count+1, getpid());
png_count++;
printf("Converting: %s\n", image_in_path);
execlp("convert", "convert", image_in_path, "-resize", "200x200", image_out_path, NULL);
exit(1);
}
/* GIF conversion */
else if ((getpid() % 3) == 0) {
image_in_path = getInPath(input_dir, gif_images[gif_count]);
image_out_path = getOutPath(output_dir, gif_images[gif_count]);
printf("image_in_path: %s\n", image_in_path);
printf("Child (%d): %d\n", gif_count+1, getpid());
gif_count++;
printf("Converting: %s\n", image_in_path);
execlp("convert", "convert", image_in_path, "-resize", "200x200", image_out_path, NULL);
exit(1);
}
/* BMP conversion */
else {
image_in_path = getInPath(input_dir, bmp_images[bmp_count]);
image_out_path = getOutPath(output_dir, bmp_images[bmp_count]);
printf("image_in_path: %s\n", image_in_path);
printf("Child (%d): %d\n", bmp_count+1, getpid());
bmp_count++;
printf("Converting: %s\n", image_in_path);
execlp("convert", "convert", image_in_path, "-resize", "200x200", image_out_path, NULL);
exit(1);
}
}
else {
/* Parent Execution */
wait(NULL);
}
}
输出:
+++++++++++CREATING PROCESSES+++++++++++
image_in_path: idir/panda.bmp
Child (1): 5389
Converting: idir/panda.bmp
image_in_path: idir/panda.bmp
Child (1): 5393
Converting: idir/panda.bmp
image_in_path: idir/penguin.gif
Child (1): 5397
Converting: idir/penguin.gif
image_in_path: idir/bmp.png
Child (1): 5402
Converting: idir/bmp.png
image_in_path: idir/bmp.png
Child (1): 5408
Converting: idir/bmp.png
image_in_path: idir/panda.bmp
Child (1): 5413
Converting: idir/panda.bmp
image_in_path: idir/panda.bmp
Child (1): 5417
Converting: idir/panda.bmp
image_in_path: idir/penguin.gif
Child (1): 5421
Converting: idir/penguin.gif
image_in_path: idir/panda.bmp
Child (1): 5425
Converting: idir/panda.bmp
image_in_path: idir/panda.bmp
Child (1): 5429
Converting: idir/panda.bmp
提前感谢您的帮助!我花了太多时间试图解决这个问题,但没有运气。
【问题讨论】:
-
变量确实会增加,但它们只会在孩子中增加。然后子 execs 并且增加的值被销毁。
-
您是否尝试过使用调试器(例如 gdb)来记录实际发生的情况?
-
你应该在
fork()之前做fflush(NULL);