Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Блокировка файлов 
:(
    Опции темы
Ripper
Дата 18.5.2010, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

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



Доброе время суток. Вопрос теоретический)
Если я создаю процесс, делаю форки, получаются дочерние процессы. Они наследуют все дескрипторы файлов, и, используя ф-ию fcntl я могу заблокриовать файл.
А если я процессы запускаю независимо, т.е. ну написал одну программу, другую - у них будут же разные дескрипторы. 
Что нужно использовать чтобы когда одна программа пишет в файл, другая ждала окончания записи?
И ещё пока я смотрел в инете ф-ии блокировки, нашел чуть ли не три разных варианта, fcntl, flock и ещё что-то...
спасибо


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
boostcoder
Дата 18.5.2010, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



блокируй файл.
используй ту функцию, что больше подходит.
PM WWW   Вверх
Ripper
Дата 19.5.2010, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

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



Хм, сделал 2 программы, одна читает другая пишет. Через потоки ifstream/ofstream. Если пишу - читающий поток не может открыть, если открываю - пишущий может писать( Почему так?

И ещё, в поиске на форуме нашел примеры с flock. Формат flock (fd, LOCK_EX) допустим. У меня компилятор пишет что нет такого формата ф-ии, и что нужно в flock передавать const flock&. Чего так(


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
djamshud
Дата 19.5.2010, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



Маны для кого написаны? flock принимает два инта: первый - дескриптор файла (открытого open), второй - тип блокировки.

Добавлено через 5 минут и 16 секунд
Ну и:
#include <sys/file.h>


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
MAKCim
Дата 19.5.2010, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Ripper, 
leases locking
man 2 fcntl


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ripper
Дата 20.5.2010, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

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



djamshud, а, просто у меня был подключен fcntl.h и он писал что формат функции другой (т.е. не ненаходил её, а именно писал что она есть но с другим форматом). Спасибо большое


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
Ripper
Дата 21.5.2010, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

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



Написал с помощью 2х разных методов блокировку, запускал 2 программы: одну со слипом, другую без. И все равно не получилось заблокировать. 
Первая:
Код

#include <fcntl.h>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <sys/file.h>

#define FILE_NAME "../coords.dat"

using namespace std;

int main() {
    FILE* fCoords;
    fCoords = fopen(FILE_NAME, "w+");
    int fd = fileno(fCoords);

    if (flock(fd, LOCK_EX)) {
        cout << "File is already locked" << endl;
        return 0;
    }

    cout << "File is locked." << endl;

    int delay = 0;
    cout << "Enter delay:" << endl;
    cin >> delay;
    sleep(delay);

    flock(fd, LOCK_UN);
    cout << "File is unlocked." << endl;

    return 0;
}




Вторая:
Код

#include <fcntl.h>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <sys/file.h>

#define FILE_NAME "../coords.dat"

using namespace std;

int main() {
    FILE* fCoords;
    fCoords = fopen(FILE_NAME, "w+");
    int fd = fileno(fCoords);
    if (ftrylockfile (fCoords)) {
        cout << "Cannot lock file. The file is already locked" << endl;
        return 0;
    }
    flockfile(fCoords); //Как я прочитал ftrylockfile() is a non-blocking version of flockfile(), т.е. как я понял для проверки нужна чтоли, поэтому ещё раз тут блокирую
    cout << "File is locked." << endl;

    int delay = 0;
    cout << "Enter delay:" << endl;
    cin >> delay;
    sleep(delay);

    funlockfile(fCoords);
    cout << "File is unlocked." << endl;
    return 0;

}



В обоих случаях не заходит в if блок :( Что здесь не так? Чувствую что где-то совсем туплю) 
Спасибо 


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
MAKCim
Дата 21.5.2010, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Ripper, 
я же написал leases locking
man 2 fcntl


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




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


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

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