LINUX.ORG.RU

flock


0

0
В общем есть прога, которая форкает -е число процессов, которые после 
выполнения своего пишут в лог. Как правильно это сделать ? пока делаю
так:

snprintf(buf_r, STR_BUF-1, "%s %d\n", buf, result);
			if ((fd = open(cur_log,O_WRONLY|O_CREAT|O_APPEND),S_IRUSR) == -1) {
 perror("Unable to open log file");
	exit(-1);
}
if (flock(fd,LOCK_EX)) {
	perror("Unable to get exclusive lock for log file");
	close(fd);
	exit(-2);
}
write(fd,buf_r,sizeof(char)*strlen(buf_r));
if (flock(fd,LOCK_UN)) {
	perror("Unable to remove exclusive lock for log file");
	close(fd);
	exit(-3);
}
close(fd);

Насколько это корректно? Просто время от времени прога выдает:
Unable to get exclusive lock for log file: Bad file descriptor
Unable to get exclusive lock for log file: Bad file descriptor
Unable to get exclusive lock for log file: Bad file descriptor

Хотя в лог все равно записывается.
anonymous
Для журнала лучше использовать syslog (man openlog, man 3 syslog).

write пишет потому, что в данном случае нет обязательной блокировки, т.е. flock не блокируется если уже кот-то заблокировал файл . Подробности описаны в документации к исходникам (ищи файл mandatory.txt). man fcntl.

kosmonavt
()
файл нужно открывать в режиме не write a append и всю строку выбрасывать не по частям а _одним_ write
cvv ★★★★★
()
Ответ на: комментарий от cvv
Так я его вроде и открываю как write & append (или надо тока append) ? А как сделать чтобы процесс блкировался до тех пор, пока ему не дадут записать в файл итоги своей работы ?
anonymous
()
Ответ на: комментарий от anonymous
Синхронизацию с семафорами делай или пусть в файл пишет специальный процес (например, родительский), а ты обмен организуй.
kosmonavt
()
Ответ на: комментарий от kosmonavt
>Синхронизацию с семафорами

Тут я перегнул, мьютекса хватит.

kosmonavt
()
Ответ на: комментарий от anonymous
> А как сделать чтобы процесс блкировался до тех пор,
> пока ему не дадут записать в файл итоги своей работы ?

как уже сказал вам cvv, вам не нужны никакие блокировки,
если файл открыт с флагом O_APPEND, запись будет добавлена
в конец файла атомарно.
idle ★★★★★
()
Ответ на: комментарий от idle
Что то последнее время часто стало встречаться (мне) это слово - атомарно. Можете объяснить что оно значит ? И касательно моего вопроса - т.е. и без блокировок все будет ок?
anonymous
()
Ответ на: комментарий от anonymous
>Можете объяснить что оно значит ?

ето то что те надо

>И касательно моего вопроса - т.е. и без блокировок все будет ок?

если append укажеш ВМЕСТО write

cvv ★★★★★
()
Ответ на: комментарий от anonymous
атомарно - неделимо... вобщем-от то что тебе надо :)
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.