ВУЗ:
Составители:
73
{
int semval;
semval = semctl(sid, member, GETVAL, 0);
return(semval);
}
void changemode(int sid, char *mode)
{
int rc;
union semun semopts;
struct semid_ds mysemds;
/* Получаем текущее значение для внутренней структуры данных */
semopts.buf = &mysemds;
rc = semctl(sid, 0, IPC_STAT, semopts);
if (rc == -1) {
perror("semctl");
exit(1);
}
printf("Old permissions were %o\n", semopts.buf->sem_perm.mode);
/* Изменяем права доступа к семафору */
sscanf(mode, "%ho", &semopts.buf->sem_perm.mode);
/* Обновляем внутреннюю структуру данных */
semctl(sid, 0, IPC_SET, semopts);
printf("Updated...\n");
}
void dispval(int sid, int member)
{
int semval:
semval = semctl(sid, member, GETVAL, 0);
printf("semval for member %d is %d\n", member, semval);
}
void usage(void)
{
fprintf(stderr, "semtool - A utility for tinkering with
semaphores\n");
fprintf(stderr, "\nUSAGE: semtool4 (c)reate <semcount>\n");
fprintf(stderr, " (l)ock <sem #>\n");
fprintf(stderr, " (u)nlock <sem #>\n");
fprintf(stderr, " (d)elete\n");
fprintf(stderr, " (m)ode <mode>\n");
exit(1);
}
Блокировка участков файлов
Если говорить именно о файле с базой данных, оказывается удобно
блокировать доступ к участкам файла. При этом целесообразно ввести два типа
блокировок: на чтение и на запись. Блокировка на чтение разрешает другим процессам
читать из заблокированного участка и даже ставить туда такую же блокировку, но
запрещает писать в этот участок и, тем более, блокировать его на запись.
{
int semval;
semval = semctl(sid, member, GETVAL, 0);
return(semval);
}
void changemode(int sid, char *mode)
{
int rc;
union semun semopts;
struct semid_ds mysemds;
/* Получаем текущее значение для внутренней структуры данных */
semopts.buf = &mysemds;
rc = semctl(sid, 0, IPC_STAT, semopts);
if (rc == -1) {
perror("semctl");
exit(1);
}
printf("Old permissions were %o\n", semopts.buf->sem_perm.mode);
/* Изменяем права доступа к семафору */
sscanf(mode, "%ho", &semopts.buf->sem_perm.mode);
/* Обновляем внутреннюю структуру данных */
semctl(sid, 0, IPC_SET, semopts);
printf("Updated...\n");
}
void dispval(int sid, int member)
{
int semval:
semval = semctl(sid, member, GETVAL, 0);
printf("semval for member %d is %d\n", member, semval);
}
void usage(void)
{
fprintf(stderr, "semtool - A utility for tinkering with
semaphores\n");
fprintf(stderr, "\nUSAGE: semtool4 (c)reate \n");
fprintf(stderr, " (l)ock \n");
fprintf(stderr, " (u)nlock \n");
fprintf(stderr, " (d)elete\n");
fprintf(stderr, " (m)ode \n");
exit(1);
}
Блокировка участков файлов
Если говорить именно о файле с базой данных, оказывается удобно
блокировать доступ к участкам файла. При этом целесообразно ввести два типа
блокировок: на чтение и на запись. Блокировка на чтение разрешает другим процессам
читать из заблокированного участка и даже ставить туда такую же блокировку, но
запрещает писать в этот участок и, тем более, блокировать его на запись.
73
