Просто у Вас сама схема разделения файла неправильная, особенно с переименованием. Так как получается, что это не один файл, а куча файлов с иногда одинаковым именем.
Вообще-то обмен или запись некольких процессов в один файл всегда не есть хорошо!
Лучше взять пример с syslog или подобного сервиса, где ТОЛЬКО ОДИН процесс(сервис) пишет в файл, его переименовывает и как хочет с ним, так и хозяйничает, а все остальные работают с данным процессом через сокеты.
Для облегчения задачи можно использовать очереди типа zeromq или rabbitmq, или какой-то подобный фреймворк.
Если же по каким-то причинам сокеты использовать нельзя, то делать придется таким образом:
1) Пишем во временный файл.
2) Захватываем блокировку на целевой файл и переписываем его содержимое
3) убираем блокировку, удаляем временный файл.
Но, блин, как же все это будет тормозить и глючить при больших объемах!!!
PS. Вообще-то блокировки были придуманы для того, чтобы обеспечить консистентность, когда ОДИН пишет, а ДРУГИЕ читают. Или для того чтобы куча процессов дописывало в конец файла. Захватил-записал-отпустил. Для всего остального в базе ОС есть IPC, пайпы и сокеты (в том числе и файловые-UNIX).
О, вот по-русски классику нашел -
citforum.ru/operating_systems/linux_pg/lpg_02.shtml