Создаю семафор в ядре, точнее в функции fs/read_write.c, чтобы обезопасить работу своего кода в многопоточной среде. Каждый раз мне возвращается новый семафор... Почему, ведь IPC_EXCL говорит, что если создан семафор, то вернется ошибка и в этом случае я буду работать с уже существующим семафором...
смотрю ipcs -s - семафор создан.
int sid;
union semun semopts;
semopts.val = 1;
struct sembuf sem_lock;
key_t sem_key=16384;
Может кто-нибудь подскажет, не могу понять проблему.
Работаю в ядре. Перехватываю запись в определенный файл в sys_pwrite64.
При перехвате записи в файл меня интересует информация - сдвиг(место записи) и размер записи, чтобы вычислить изменившийся сектор.
Далее идея такая - получить bitmap определенного размера, в котором выставлены биты для изменившихся секторов.
Сейчас использую shared memory System V, чтобы делать все в ядре. Возникает следующая проблема - при работе с одной ниткой проблем нет, а вот при работе большего количества ниток возникает BUG: unable to handle paging request at 0x...
Копаясь с проблемой нашел, что происходит это в момент, когда у меня одна из ниток получает при вызове shmat другой адрес (на тот же сегмент), что само по себе нормально. И в этот же момент какая-нибудь нитка пишет по адресу, полученному в своем контексте. В какой конкретно нитке происходит ошибка, пока не знаю, но, предполагаю, что в той, которая пишет по старому адресу.
Пытался сделать синхронизацию через семафоры, но не хватило пока времени закончить, проблема возникла, что каждый раз инициализируется семафор заново каждой ниткой и не происходит блокировки.
Собственно вопрос в том, как быть? Может кто-то сталкивался с таким? Любые соображения приветствуются.