Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[Unix] flock на си 08.12.03 20:15
Автор: r-lynx Статус: Незарегистрированный пользователь
|
Как пользоваться этой штукой? Мне к примеру надо, что у меня висит в памяти много независимых процессов, и все они каждую секунду обращаются на чтение запись в файл, застрял на том, что когда критическое количество процессов превышает некий порог - файл просто обнуляется, а с помощью flock можно этого избежать.
Какова там вообще суть работы этой шняги под unix?
вот кусок моего кода:
bool DisabledIP()
{
bool found=false;
int f=open(DISADDRESSES,O_RDONLY);
if(f==-1)
{
int fd=creat(DISADDRESSES,000660);
return false;
if(f==-1)return true;
}
int fnew=creat(DISADDRESSESNEW,000660);
if(fnew!=-1)
{
TBanIP tmpip;
long curtime;
time(&curtime);
char curip[16];
strcpy(curip,getenv("REMOTE_ADDR"));
while(read(f,&tmpip,sizeof(TBanIP))>0)
{
if(curtime<tmpip.expires)
{
write(fnew,&tmpip,sizeof(TBanIP));
if(strstr(curip,tmpip.ip)==curip)found=true;
}
}
}
else
{
close(f);
close(fnew);
return true;
}
close(fnew);
close(f);
remove(DISADDRESSES);
rename(DISADDRESSESNEW,DISADDRESSES);
return found;
}
|
|
[Unix] man flock 08.12.03 22:13
Автор: LLL <Алексей> Статус: Member
|
Там вроде вполне подробно описано, что эта штука делает, а как пользоваться, уже будет несложно догадаться.
И рекомендую использовать для вписывания исходников тэг < pre > (без пробелов). Ведущие пробелы тогда из исходника не пропадут, что несомненно улучшит его читабельность.
|
| |
Все равно не понимаю. До меня туго обычно доходит :-(
09.12.03 04:53
Автор: r-lynx Статус: Незарегистрированный пользователь
|
> Там вроде вполне подробно описано, что эта штука делает, а > как пользоваться, уже будет несложно догадаться. > И рекомендую использовать для вписывания исходников тэг > < pre > (без пробелов). Ведущие пробелы тогда из > исходника не пропадут, что несомненно улучшит его > читабельность.
Все равно не понимаю. До меня туго обычно доходит :-(
Оно там лочится на уровне ядра? Если к примеру файл занят, то что, другой процесс получает отлуп и умирает? Или он дожидается освобождения файла? Или мне все в цикл загнать что бы он гонялся в бесконечном цикле пока файл не освободится и он туда не запишется?
|
| | |
типа так: 09.12.03 11:04
Автор: LLL <Алексей> Статус: Member
|
> Оно там лочится на уровне ядра? Если к примеру файл занят, > то что, другой процесс получает отлуп и умирает? Или он > дожидается освобождения файла? Или мне все в цикл загнать > что бы он гонялся в бесконечном цикле пока файл не > освободится и он туда не запишется?
fd = open(...);
flock(fd, LOCK_EX);
/* работаем с файлом */
flock(fd, LOCK_UN);
close(fd);
---
Возможно успешный вызов close() сам снимет lock, точно не знаю. Это если процессу надо по-любому дожидаться, когда другой процесс освободит файл. А если не обязательно, то можно так:
fd = open(...);
if(flock(fd, LOCK_EX | LOCK_NB) == 0)
{
/* работаем с файлом */
flock(fd, LOCK_UN);
}
else
puts("Оно уже занято кем-то");
close(fd);
---
или так:
fd = open(...);
while(locked = flock(fd, LOCK_EX | LOCK_NB))
{
if(достало ждать, пока освободится)
break;
sleep(1);
}
if(locked)
puts("Ни фига не дождались освобождения");
else
{
/* работаем с файлом */
flock(fd, LOCK_UN);
}
close(fd);
---
|
|
|