информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsАтака на InternetВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
типа так: 09.12.03 11:04  Число просмотров: 1836
Автор: 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);

---
<programming>
[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);

---
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach