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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.