Я написал этот код на 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 раз строку.
Я установил buf размером 100, который может содержать полную строку.
Затем я создал несколько процессов, выполняющих этот код, используя скрипт 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.
Так ... почему появляются эти строки?
Это единственный способ предотвратить использование блокировок файлов ... даже если я использую только режим добавления?
Заранее спасибо!