私はこのコードをCで書きました:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
void random_seed(){
struct timeval tim;
gettimeofday(&tim, NULL);
double t1=tim.tv_sec+(tim.tv_usec/1000000.0);
srand (t1);
}
void main(){
FILE *f;
int i;
int size=100;
char *buf=(char*)malloc(size);
f = fopen("output.txt", "a");
setvbuf (f, buf, _IOFBF, size);
random_seed();
for(i=0; i<200; i++){
fprintf(f, "[ xx - %d - 012345678901234567890123456789 - %d]\n", rand()%10, getpid());
fflush(f);
}
fclose(f);
free(buf);
}
このコードは、ファイルを追加モードで開き、文字列を200回添付します。完全な文字列を含めることができるサイズ100のbufを設定しました。次に、次のbashスクリプトを使用して、このコードを実行するマルチプロセスを作成しました。
#!/bin/bash
gcc source.c
rm output.txt
for i in `seq 1 100`;
do
./a.out &
done
O_APPENDフラグを使用してファイルを開くと、各書き込みの前にファイルオフセットがファイルの最後に設定され、完全にバッファリングされたストリームを使用していることを読んだため、出力で文字列が混同されることはないと予想しました。しかし、私は各プロセスの最初の行が次のように混合されていることを取得しました:
[ xx - [ xx - 7 - 012345678901234567890123456789 - 22545]
そして数行後
2 - 012345678901234567890123456789 - 22589]
rand関数を呼び出すために書き込みが中断されたようです。
それで...なぜこれらの線が現れるのですか?これを防ぐ唯一の方法は、ファイルロックを使用することです...追加モードのみを使用している場合でも?
前もって感謝します!