case 'w':
shm_write(shmid, ptr, argv[2]);
break;
case 'r':
shm_read(shmid, ptr);
break;
case 'd':
shm_rm(shmid);
break;
case 'm':
shm_change_mode(shmid, argv[2]);
break;
}
}
/* Функция для записи в сегмент: ей нужно передать
ID сегмента, адрес привязки и записываемую информацию */
shm_write(int shmid, char *ptr, char *info) {
strcpy(ptr, info);
}
/* Функция чтения информации из сегмента */
shm_read(int shmid, char *ptr) {
printf('Информация из сегмента: %s
', ptr);
}
/* Функция удаления сегмента */
shm_rm(int shmid) {
shmctl(shmid, IPC_RMID, 0);
printf('Сегмент помечен на удаление
');
}
/* Функция изменения прав доступа. Ей нужно передать
идентификатор сегмента и права доступа в виде строки,
например, '0666' * /
shm_change_mode(int shmid, char *mode) {
struct shmid_ds mds;
shmctl(shmid, IPC_STAT, &mds);
printf('Старые права доступа: %o
', mds.shm_perm.mode);
sscanf(mode, '%o', &mds.shm_perm.mode);
shmctl(shmid, IPC_SET, &mds);
printf('Новые права доступа: %o
', mds.shm_perm.mode);
}
Использовать программу нужно так:
./shm_demo -w строка
запись строки в сегмент
./shm_demo -r
чтение строки из сегмента
./shmdemo -m права
изменение прав доступа
./shm_demo -d
удаление сегмента
Выполните команду
$ ./shm_demo -w string
А затем запустите утилиту ipcs. Вы увидите, что наша программа создала разделяемый сегмент памяти:
------ Shared Memory Segments ------
key shmid owner perms bytes nattch status
0x44063781 0 root 660 256 0
------ Semaphore Arrays ------
key semid owner perns nsems status
------ Message Queues ------
key msqid owner perms used-bytes messages
Затем выполните команду:
$ ./shm_demo -r
Вы получите информацию:
Информация из сегмента: string
Попробуем изменить права доступа, а затем просмотреть информацию командой ipcs:
$./shm_demo -m 0666
------ Shared Memory Segments ------
key shmid owner perms bytes nattch status
0x44063781 0 root 660 256 0
------ Semaphore Arrays ------
key semid owner perms nsems status
------ Message Queues ------
key msqid owner perms used-bytes messages
Глава 27
Создание сетевого приложения в Linux
В главе 6 я ввел основные сетевые понятия, перечислил самые популярные протоколы и вкратце рассказал об основе сети Интернет — протоколе TCP/IP. В этой главе я собираюсь подробнее остановиться на протоколах TCP/IP и ICMP и показать, какие средства вы можете использовать для написания собственных приложений для работы в сети.
27.1. Протокол TCP/IP