| |
/* ��������� ������������
����������� ���������� ������ shmctl()
(�������� ���������� ������������ ����������) */
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
main ()
{
extern int errno;
int rtrn, shmid, command, choice;
struct shmid_ds shmid_ds, *buf;
buf = &shmid_ds;
/* ������ ������������� �������� � �������� */
printf ("������� ������������� shmid: ");
scanf ("%d", &shmid);
printf ("������� ����� ���������� ��������:\n");
printf (" IPC_STAT = 1\n");
printf (" IPC_SET = 2\n");
printf (" IPC_RMID = 3\n");
printf (" SHM_LOCK = 4\n");
printf (" SHM_UNLOCK = 5\n");
printf (" ����� = ");
scanf ("%d", &command);
/* ��������� �������� */
printf ("\n������������� = %d, �������� = %d\n",
shmid, command);
switch (command) {
case 1: /* ����������� ����������
� ��������� ������������ ��������
� ���������������� ���������
� ������� �� */
rtrn = shmctl (shmid, IPC_STAT, buf);
printf ("\n��-� ������������ = %d\n",
buf->shm_perm.uid);
printf ("��-� ������ ������������ = %d\n",
buf->shm_perm.gid);
printf ("��-� ��������� = %d\n",
buf->shm_perm.cuid);
printf ("��-� ������ ��������� = %d\n",
buf->shm_perm.cgid);
printf ("����� �� �������� = 0%o\n",
buf->shm_perm.mode);
printf ("������������������ ������� ");
buf->shm_perm.cgid);
printf ("������������ ������ = 0%x\n",
buf->shm_perm.seq);
printf ("���� = 0%x\n", buf->shm_perm.key);
printf ("������ �������� = %d\n", buf->shm_segsz);
printf ("�������� ��������� �������� = %d\n",
buf->shm_lpid);
printf ("������ ������� = %d\n", buf->shm_cpid);
printf ("����� �������������� ������� = %d\n",
buf->shm_nattch);
printf ("����� ������������ � ������ = %d\n",
buf->shm_cnattch);
printf ("��������� ������������� = %d\n",
buf->shm_atime);
printf ("��������� ������������ = %d\n",
buf->shm_dtime);
printf ("��������� ��������� = %d\n",
buf->shm_ctime);
break;
case 2: /* ������� � �������� ���� (����)
��������������� ��������� ������ */
/* �������� �������� �������� ��������� ������ */
rtrn = shmctl (shmid, IPC_STAT, buf);
printf ("������� ����� ����������� ����:\n");
printf (" shm_perm.uid = 1\n");
printf (" shm_perm.gid = 2\n");
printf (" shm_perm.mode = 3\n");
printf (" ����� = ");
scanf ("%d", &choice);
switch (choice) {
case 1:
printf ("\n������� ��-� ������������: "),
scanf ("%d", &buf->shm_perm.uid);
printf ("\n��-� ������������ = %d\n",
buf->shm_perm.uid);
break;
case 2:
printf ("\n������� ��-� ������: "),
scanf ("%d", &buf->shm_perm.gid);
printf ("\n��-� ������ = %d\n",
buf->shm_perm.uid);
break;
case 3:
printf ("\n������� ������������ ��� ����: ");
scanf ("%o", &buf->shm_perm.mode);
printf ("\n����� �� �������� = 0%o\n",
buf->shm_perm.mode);
break;
}
/* ������ ��������� */
rtrn = shmctl (shmid, IPC_SET, buf);
break;
case 3: /* ������� ������������� �
��������������� ��������� ������ */
rtrn = shmctl (shmid, IPC_RMID, NULL);
break;
case 4: /* ���������� ����������� �������
� ������ */
rtrn = shmctl (shmid, SHM_LOCK, NULL);
break;
case 5: /* ��������� ���������� ������� � ������ */
rtrn = shmctl (shmid, SHM_UNLOCK, NULL);
}
if (rtrn == -1) {
/* �������� � ��������� ���������� */
printf ("\nshmctl ���������� ��������!\n");
printf ("\n��� ������ = %d\n", errno);
}
else {
/* ��� �������� ���������� �������� ��-� shmid */
printf ("\nshmctl ���������� �������, ");
printf ("������������� shmid = %d\n", shmid);
}
exit (0);
}
/* ��������� ������������
����������� ��������� ������� shmat() � shmdt()
(�������� ��� ������������ ���������� ������) */
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
main ()
{
extern int errno;
int shmid, shmaddr, shmflg;
int flags, attach, detach, rtrn, i;
/* ���� ������������� ��� ������� �������� */
printf ("\n������� ����� ������������� ");
printf ("��� �������� (1-4): ");
scanf ("%d", &attach);
printf ("\n����� ������������� = %d\n", attach);
for (i = 0; i < attach; i++) {
/* ������ ������������� ������������ �������� */
printf ("\n������� ��-� ������������ ��������,\n");
printf ("��� ������� ����� ��������� ��������: ");
scanf ("%d", &shmid);
printf ("\n��-� �������� = %d\n", shmid);
/* ������ ����� ������������� */
printf ("\n������� ����� ������������� ");
printf ("� ����������������� ������: ");
scanf ("%x", &shmaddr);
printf ("\n����� ������������� = 0x%x\n", shmaddr);
/* ������� ��������� ����� */
printf ("\n������� ����� ������ ���������� ������:\n");
printf (" SHM_RND = 1\n");
printf (" SHM_RDONLY = 2\n");
printf (" SHM_RND � SHM_RDONLY = 3\n");
printf (" ����� = ");
scanf ("%d", &flags);
switch (flags) {
case 1:
shmflg = SHM_RND;
break;
case 2:
shmflg = SHM_RDONLY;
break;
case 3:
shmflg = SHM_RND | SHM_RDONLY;
break;
}
printf ("\n����� = 0%o", shmflg);
/* ��������� ��������� ����� shmat */
rtrn = shmat (shmid, shmaddr, shmflg);
if (rtrn == -1) {
printf ("\nshmat ���������� ��������!\n");
printf ("\��� ������ = %d\n", errno);
}
else {
printf ("\nshmat ���������� �������.\n");
printf ("������������� shmid = %d\n", shmid);
printf ("����� = 0x%x\n", rtrn);
}
}
/* ���� ������������ ��� ������� �������� */
printf ("\n������� ����� ������������ ");
printf ("��� �������� (1-4): ");
scanf ("%d", &detach);
printf ("\n����� ������������ = %d\n", detach);
for (i = 0; i < detach; i++) {
/* ������ ����� ������������ */
printf ("\n������� ����� �������������� �������� ");
printf ("� ����������������� ������: ");
scanf ("%x", &shmaddr);
printf ("\n����� ������������ = 0x%x\n", shmaddr);
/* ��������� ��������� ����� shmdt */
rtrn = shmdt (shmaddr);
if (rtrn == -1) {
printf ("\nshmdt ���������� ��������!\n");
printf ("\��� ������ = %d\n", errno);
}
else {
printf ("\nshmdt ���������� �������,\n");
printf ("������������� shmid = %d\n", shmid);
}
}
exit (0);
}