我在OSX中工作,使用bash作为shell我有一个脚本,它调用一个可执行文件数百次,每个调用都是独立的因此,我将并行运行此代码但是,对可执行文件的每次调用都将输出附加到新行上的社区文本文件。
文本文件的顺序并不重要(虽然这很好,但完全不值得过于复杂化,因为我只能使用unix sort命令),但实际上,可执行文件的每个调用都正确地打印到文件中。我担心的是,如果我并行运行脚本,因为某个奇怪的意外,两个线程将签出文本文件,打印到它,然后将不同的副本保存回文本文件的原始目录。从而使对文件的一次写入无效。
这是真的发生了,还是我对打印到文件的理解有缺陷?我不完全知道这是否也是一个个案基础,所以我将提供一些在我的程序下面正在做的模拟代码。
脚本:

#!/bin/sh
abs=$1
input=$(echo "$abs" | awk '{print 0.004 + 0.005*$1 }')
./program input

“/程序”:
~~Normal .c file stuff here~~
~~VALUE magically calculated here~~
~~run number is pulled out of input and assigned to index for sorting~~

FILE *fpp;
fpp = fopen("Doc.txt","a");
fprintf(fpp,"%d, %.3f\n", index, VALUE);
fclose(fpp);

~Closing events of program.c~~

在bash中并行运行脚本的命令:
printf "%s\n" {0..199} | xargs -P 8 -n 1 ./program

谢谢你们的帮助。

最佳答案

是的,这看起来像是一个灾难的处方如果这两个进程几乎同时打开文件,则只有一个进程将“执行”。
我建议要么(更容易)编写单独的文件,然后在处理完成时将它们放在一起,要么(更难)将所有结果发送到一个将为每个人编写文件的使用者进程。

09-28 09:07