Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> open file, open file 
:(
    Опции темы
mastercz
Дата 13.4.2009, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Добрый день!
 Сейчас под рукой нет линукс, проверить не могу, но в виндах сделал следующее.
написал две маленьких програмки.
1-ая.
Код

#!c:\Perl\bin
  open (test,">test");
  print test "QQQ";
  while(1)
   {
   }


и 2-ая.
Код

#!c:\Perl\bin


if(!open(test,">test"))
    {
        print "\n-->Ошибка доступа";
    }
else
    {
        print "\n-->Доступ есть";    
                              print test "aaa";
    }




Запускаю первую, потом запускаю вторую... и ... о чудо я пишу в файл "ааа".
В линуксе это также ? Как запретить совместный доступ к файлу на запись?
Заранее благодарю за ответ.

PM MAIL   Вверх
arto
Дата 13.4.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perldoc -f flock
PM MAIL ICQ   Вверх
mastercz
Дата 14.4.2009, 03:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Хм, чегото я не сображу чего я неправильно делаю.
С учетом flock
1-ый код
Код

#!/usr/bin/perl                             
use Fcntl ':flock';                         
open (FILE,">test");                        
if(!flock(FILE,LOCK_EX))                    
    {                                       
        print "\n--> No Lock\n"; exit();    
    }                                       
print FILE "ZZZ";                           
while(1)                                    
{                                           
    sleep(1);                               
}

2-ой код
Код

#!c:\Perl\bin
if(open (FILE,">test"))
    {
        print "\n->> Не работает блокировка.";
        print FILE "qqq";
    }
else
    {
        print "\n->> Работает блокировка.";    
    }


2-ой код приспокойно перезаписывает файл test, также я могу его удалить.
ОС ASPLinux Server IV;


Это сообщение отредактировал(а) mastercz - 14.4.2009, 03:53
PM MAIL   Вверх
arto
Дата 14.4.2009, 06:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



блокировку надо использовать в обеих скриптах
PM MAIL ICQ   Вверх
mastercz
Дата 14.4.2009, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Спасибо arto за подсказку. Вроди бы разобрался.
Посмотрите пожалуйста следующий куско кода, есть ли в нем слабые места :
Заранее благодарю за коментарий.
Код

        my $tmpfile;
                        my $Myflock="FALSE";
                        do{
                            do    
                              {
                                $tmpfile=qx/date +%j%H%M%S%N/; chop($tmpfile);
                                $tmpfile=substr($tmpfile,0,15)."\.ttt";
                              } while(-e $TempDir.$tmpfile);
                                
                            open(TMPFILE,">>".$TempDir.$tmpfile);
                            
                            if (flock(TMPFILE, 2|4))
                                {
                                    $Myflock="TRUE";
                                }
                            else
                                {
                                    close(TMPFILE);
                                    usleep(50000);
                                }
                        }while($Myflock eq "FALSE");
                        
                            print TMPFILE "qqq";
                        close(TMPFILE);
                #---> Тут работа с временным файлом.
                 unlink($TempDir.$tmpfile);

PM MAIL   Вверх
arto
Дата 14.4.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



1. вместо qx/date/ -- use POSIC qw( strftime )
2. вместо $tmpfile -- use File::Temp
3. usleep(50000) --> usleep (10000+int rand 40000)
PM MAIL ICQ   Вверх
mastercz
Дата 15.4.2009, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Подскажите пожалуйста, как средствами перл можно получить текущую метку времени до милисекунд;
PM MAIL   Вверх
arto
Дата 15.4.2009, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perldoc Time::HiRes
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.