информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
Все равно не понимаю. До меня туго обычно доходит :-( 09.12.03 04:53  Число просмотров: 2136
Автор: r-lynx Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Там вроде вполне подробно описано, что эта штука делает, а
> как пользоваться, уже будет несложно догадаться.
> И рекомендую использовать для вписывания исходников тэг
> < pre > (без пробелов). Ведущие пробелы тогда из
> исходника не пропадут, что несомненно улучшит его
> читабельность.

Все равно не понимаю. До меня туго обычно доходит :-(
Оно там лочится на уровне ядра? Если к примеру файл занят, то что, другой процесс получает отлуп и умирает? Или он дожидается освобождения файла? Или мне все в цикл загнать что бы он гонялся в бесконечном цикле пока файл не освободится и он туда не запишется?
<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-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach