Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 19.07.2012, 12:38   #1
Balabek
Пользователь
 
Аватар для Balabek
 
Регистрация: 14.12.2010
Адрес: Алматы
Сообщений: 20
Репутация: 5
По умолчанию Блокирование файла

Приветствую, знатоки!
У меня такой вопрос: есть два процесса (аналогичные) по записи в файл данных (типа int). Для того чтобы они не мешали друг другу я блокирую файл при работе одного из процессов. Однако, если файл уже существует, то все проходит нормально и сперва записывает один процесс, потом другой. Если файл не существует а при CreateProcess у меня стоит OPEN_ALWAYS, то блокировка не срабатывает и они записывают одновременно. Подскажите, пожалуйста, в чем причина.
Вот коды процессов:
#include<windows.h>
#include<iostream.h>

int main(){
DWORD dwCount;
HANDLE hFile;
DWORD dwFileSize;

hFile=CreateFile("C:\\Documents and Settings\\bberdybekov\\Private\\C++ \\MyProjects\\FileBlock1\\Debug\\Fi leBlock.dat",
GENERIC_WRITE,FILE_SHARE_WRITE,NULL ,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);

if(hFile==INVALID_HANDLE_VALUE){
cerr<<"Create file failed."<<endl
<<"The last error code: "<<GetLastError()<<endl;
cout<<"Press any key to finish.";
cin.get();

return 0;

}

dwFileSize=GetFileSize(hFile,NULL);

if(dwFileSize==-1){
cerr<<"Get file size failed."<<endl
<<"The last error code: "<<GetLastError()<<endl;
CloseHandle(hFile);
cout<<"Press any key to finish.";
cin.get();
return 0;
}

/*if(!LockFile(hFile,0,0,dwFileSize, 0)){
cerr<<"Lock file failed."
<<"The last error code: "<<GetLastError()<<endl;
CloseHandle(hFile);
cout<<"Press any key to finish."<<endl;
cin.get();
return 0;
}*/

while(!LockFile(hFile,0,0,dwFileSiz e,0));
cout<<"Now the file is locked."<<endl
<<"Press any key to continue."<<endl;
//cin.get();

//SetFilePointer(hFile,0,NULL,FILE_EN D);

for(int i=0;i<10;i++){
cout<<i<<endl;
SetFilePointer(hFile,0,NULL,FILE_EN D);
WriteFile(hFile,&i,sizeof(i),&dwCou nt,NULL);
Sleep(1000);
}


if(!UnlockFile(hFile,0,0,dwFileSize ,0)){
cerr<<"Unlock file failed."<<endl
<<"The last error code: "<<GetLastError()<<endl;
CloseHandle(hFile);
cout<<"Press any key to finish.";
cin.get();
return 0;
}
cout<<"Now the file is unlocked."<<endl
<<"Press any key to continue."<<endl;
cin.get();
CloseHandle(hFile);

return 0;
}
Второй аналогичный. Запускаются одновременно
Balabek вне форума   Ответить с цитированием
Старый 19.07.2012, 13:12   #2
blacktener
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 78
Репутация: 53
По умолчанию

заключи код в тэг [\CODE], читать невозможно
blacktener вне форума   Ответить с цитированием
Старый 19.07.2012, 13:44   #3
Krok27
Участник клуба
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Адрес: Москва
Сообщений: 505
Репутация: 181
По умолчанию

Цитата:
Запускаются одновременно
Это обязательное условие?
__________________
Знающий не говорит, говорящий не знает (С) Лао Цзы

Последний раз редактировалось Krok27; 19.07.2012 в 13:57.
Krok27 вне форума   Ответить с цитированием
Старый 19.07.2012, 16:05   #4
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,848
Репутация: 1915
По умолчанию

CREATE_NEW создаст файл только если его нет, иначе будет INVALID_HANDLE.
Если пользуемся Windows зачем отравлять себе так жизнь? Для етих целей есть CreateMutex() / WaitForSingleObject
waleri на форуме   Ответить с цитированием
Старый 20.07.2012, 13:23   #5
Balabek
Пользователь
 
Аватар для Balabek
 
Регистрация: 14.12.2010
Адрес: Алматы
Сообщений: 20
Репутация: 5
По умолчанию

С мьютексами я проработал код и проблем на одном компе нет. Но у меня процессы на разных компьютерах в сети. А мьютекс сработает если процессоры на разных компьютерах?
Balabek вне форума   Ответить с цитированием
Старый 20.07.2012, 13:25   #6
Balabek
Пользователь
 
Аватар для Balabek
 
Регистрация: 14.12.2010
Адрес: Алматы
Сообщений: 20
Репутация: 5
По умолчанию

Цитата:
Запускаются одновременно
Это обязательное условие?
Да это обязательное условие )
Balabek вне форума   Ответить с цитированием
Старый 20.07.2012, 13:25   #7
Balabek
Пользователь
 
Аватар для Balabek
 
Регистрация: 14.12.2010
Адрес: Алматы
Сообщений: 20
Репутация: 5
По умолчанию

да это обязательное условие
Balabek вне форума   Ответить с цитированием
Старый 20.07.2012, 13:27   #8
Balabek
Пользователь
 
Аватар для Balabek
 
Регистрация: 14.12.2010
Адрес: Алматы
Сообщений: 20
Репутация: 5
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
CREATE_NEW создаст файл только если его нет, иначе будет INVALID_HANDLE.
Если пользуемся Windows зачем отравлять себе так жизнь? Для етих целей есть CreateMutex() / WaitForSingleObject
Немного не понял зачем CREATE_NEW. Мне нужно чтобы оба процесса проработали с файлом )
Balabek вне форума   Ответить с цитированием
Старый 20.07.2012, 13:59   #9
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,848
Репутация: 1915
По умолчанию

Цитата:
Сообщение от Balabek Посмотреть сообщение
Немного не понял зачем CREATE_NEW. Мне нужно чтобы оба процесса проработали с файлом )
Я сначала в код не вникал - думал, что есть файл семафор - вот для него и нужен был CREATE_NEW. Раз семафора нет и оба процеса пытаются одновременно, тогда два варианта:

а) Открывам файл с FILE_SHARE_READ, после чего второй процес должен получить access denied ошибку и будет циклить пока не дорвется до файла. Хотя хрен знает по сети какая ошибка вылезет.

б) Открываем/Закрываем/Открываем файл. Таким образом файл *всегда* будет существовать ну а в этом случае как мы поняли все работает.
waleri на форуме   Ответить с цитированием
Старый 20.07.2012, 14:18   #10
Balabek
Пользователь
 
Аватар для Balabek
 
Регистрация: 14.12.2010
Адрес: Алматы
Сообщений: 20
Репутация: 5
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Я сначала в код не вникал - думал, что есть файл семафор - вот для него и нужен был CREATE_NEW. Раз семафора нет и оба процеса пытаются одновременно, тогда два варианта:

а) Открывам файл с FILE_SHARE_READ, после чего второй процес должен получить access denied ошибку и будет циклить пока не дорвется до файла. Хотя хрен знает по сети какая ошибка вылезет.

б) Открываем/Закрываем/Открываем файл. Таким образом файл *всегда* будет существовать ну а в этом случае как мы поняли все работает.
Первый вариант я пробовали он даже на одном компьютере выдает ошибку. Циклить с CreateFile не дает. Второй сейчас попробую... Нет не работает так. Вообще у меня этих процессов будет 30 в сети и каждый будет лезть на сервер отметиться в файле. )) Вот я и думаю как синхронизировать работу с этим файлом по сети.

Последний раз редактировалось Balabek; 20.07.2012 в 14:25.
Balabek вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Блокирование портов DeDoK Работа с сетью в Delphi 3 25.01.2011 20:54
блокирование доступа Che Guevara PHP 2 18.10.2010 16:24
блокирование клавиатуры transserg Win Api 6 01.04.2010 11:06
Блокирование ALT+F4 Killbrum Win Api 5 14.03.2009 13:23
блокирование функции Fireleo Win Api 5 29.07.2007 17:04


12:35.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru