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

Поиск:

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


Новичок



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

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



Прошу небольшого наставления, в каком направлении двигаться.

Напишите программу, имеющую как минимум два режима работы:
1.    Просмотр записи. В этом режиме ни один другой экземпляр программы не должен иметь возможность редактирования просматриваемой записи. Если какой-либо экземпляр программы осуществляет редактирование записи, в просмотре записи должно быть отказано.
2.    Редактирование записи. В этом режиме экземпляр программы должен иметь эксклюзивный доступ к записи, ни один другой экземпляр не должен получить доступ для чтения или записи. Вход в режим редактирования должен быть возможен только в том случае, если ни один другой экземпляр программы не работает с данной записью.

У меня создалось впечатление, возможно, ошибочное, что в Linux с блокировками не все так просто. Если использовать функцию fcntl() и захватить файл на чтение, автоматически ли это запретит запись в этот же файл в другой копии этого же приложения (сгенерится ошибка, будет запущено ожидание разблокирования) или просто сие проигнорируется? Если да, то что предпринять, чтобы в ситуации, когда файл открфт на чтение, копия программы не могла открыть его же на запись...

Спасибо заранее... Надеюсь вопрос не совсем глуп)))

Это сообщение отредактировал(а) assasinnn - 16.11.2009, 19:51
PM MAIL   Вверх
andrew_121
Дата 16.11.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



assasinnn, Ты что, с определенной переодичностью будешь создавать эту тему?
http://forum.vingrad.ru/topic-275311.html - это тоже твоя.
И, поищи в этом разделе, найдешь еще несколько.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
MAKCim
Дата 16.11.2009, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

int main(int argc, char *argv[])
{
    int fd;
    int error;
    char fn[PATH_MAX];
    struct stat st;
    pthread_rwlock_t *l;
    size_t size;
    int flags;
    int action;

    error = -1;

    if (argc != 2)
    {
        printf("usage: %s <action>\n", argv[0]);
        return -1;
    }

    action = atoi(argv[1]);

    if (snprintf(fn, sizeof(fn), "%s.lock", argv[0]) >= sizeof(fn))
    {
        printf("program name [%s] is too long\n", argv[0]);
        return -1;
    }

start:    
    
    flags = O_CREAT | O_RDWR | O_EXCL;

    if ((fd = open(fn, flags, 0600)) < 0)
    {
        if (errno != EEXIST)
        {
            printf("open() failed [%s]\n", strerror(errno));
            return -1;
        }
    
        flags &= ~(O_CREAT | O_EXCL);
    }
    else if (flags & O_CREAT)
    {
        pthread_rwlock_t __l;

        if (pthread_rwlock_init(&__l, NULL) < 0 || write(fd, &__l, sizeof(__l)) != sizeof(__l))
        {
            printf("pthread_rwlock_init()/write() failed [%s]\n", strerror(errno));
            if (unlink(fn) < 0)
            {
                printf("unlink() failed [%s]\n", strerror(errno));
            }
            goto error_fd;
        }

        goto mmap;
    }

    if (fstat(fd, &st) < 0)
    {
        printf("stat() failed [%s]\n", strerror(errno));
        goto error_fd;
    }

    size = (size_t)st.st_size;

    if (size != sizeof(pthread_rwlock_t))
    {
        close(fd);
        sched_yield();
        goto start;
    }

mmap:

    if ((l = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED)
    {
        printf("mmap() failed [%s]\n", strerror(errno));
        goto error_fd;
    }

    switch (action)
    {
        case 1:    // read record
            result = pthread_rwlock_rdlock(l);
            break;
        case 2:    // edit record
            result = pthread_rwlock_wrlock(l);
            break;
        default:
            printf("unknown action [%d]\n", action);
            goto error_mmap;
    }

        // action and lock release

    error = 0;

error_mmap:
    munmap(l, size);

error_fd:
    close(fd);

    return error;
}



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

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

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

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


 




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


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

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