ΠΠ°ΠΏΡΡΡΠΈΠ² ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΠΏΠ°ΠΌΡΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ptr, Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΌ ΠΈ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ. ΠΡΠΈΠ²Π΅Π΄Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠ΅ΡΡΠΈΠΊΠ° ΠΏΠ΅ΡΠ΅Π΄ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²:
solaris % incr2 /tmp/temp.110000
child: 0 Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ
child: 1
β¦
child: 128
child: 129
parent: 130 Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ
parent: 131
β¦
parent: 636
parent: 637
child: 638 ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ
child: 639
β¦
child: 1517
child: 1518
parent: 1519 Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ
parent: 1520
β¦
parent: 19999 ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΡΡΡΠΎΠΊΠ° Π²ΡΠ²ΠΎΠ΄Π°
solaris % od βD /tmp/temp.1
0000000 0000020000
0000004
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΎΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡΡ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π·Π³Π»ΡΠ½ΡΡΡ Π½Π° Π΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ od ΠΈ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠ° (20000) Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΡΠ»ΠΎ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΎ Π² ΡΠ°ΠΉΠ»Π΅.
ΠΠ° ΡΠΈΡ. 12.6 ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π° ΡΡ Π΅ΠΌΠ°, ΠΎΡΠ»ΠΈΡΠ°ΡΡΠ°ΡΡΡ ΠΎΡ ΡΠΈΡ. 12.4. ΠΠ΄Π΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠ°Ρ ΠΏΠ°ΠΌΡΡΡ ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΡΡΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ. Π‘Π΅ΠΌΠ°ΡΠΎΡ ΠΌΡ ΠΈΠ·ΠΎΠ±ΡΠ°Π·ΠΈΠ»ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π½ΡΠΌ Π² ΡΠ΄ΡΠ΅, Π½ΠΎ Π΄Π»Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² Posix ΡΡΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ. Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±Π»Π°Π΄Π°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎΠΉ ΠΆΠΈΠ²ΡΡΠ΅ΡΡΡΡ, Π½ΠΎ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ Π½Π΅ ΠΌΠ΅Π½ΡΡΠ΅ ΠΆΠΈΠ²ΡΡΠ΅ΡΡΠΈ ΡΠ΄ΡΠ°. Π‘Π΅ΠΌΠ°ΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅ΡΠ΅Π· ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡΡ, ΡΡΠΎ ΠΌΡ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°Π»ΠΈ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 10.15.
Π ΠΈΡ. 12.6. Π ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΈ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΡ ΠΏΠ°ΠΌΡΡΡ ΠΈ ΠΎΠ±ΡΠΈΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ
ΠΡ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ, ΡΡΠΎ Ρ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΈ Π΄ΠΎΡΠ΅ΡΠ½Π΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈΠΌΠ΅ΡΡΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΊΠΎΠΏΠΈΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ptr, Π½ΠΎ ΠΎΠ±Π΅ ΠΊΠΎΠΏΠΈΠΈ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π° ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ β ΡΡΠ΅ΡΡΠΈΠΊ, ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΠΌΡΠΉ ΠΎΠ±ΠΎΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ.
ΠΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 12.2 ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ Posix, ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌΡΠ΅ Π² ΠΏΠ°ΠΌΡΡΠΈ (Π²ΠΌΠ΅ΡΡΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ ). Π Π°Π·ΠΌΠ΅ΡΡΠΈΠΌ ΡΠ°ΠΊΠΎΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ Π² ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠΎΠ²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 12.3.
ΠΠΈΡΡΠΈΠ½Π³ 12.3. Π‘ΡΠ΅ΡΡΠΈΠΊ ΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Ρ Π² ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ//shm/incr3.c
1 #include "unpipc.h"
2 struct shared {
3 sem_t mutex; /* Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅: ΡΠ΅ΠΌΠ°ΡΠΎΡ, ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌΡΠΉ Π² ΠΏΠ°ΠΌΡΡΠΈ */
4 int count; /* ΠΈ ΡΡΠ΅ΡΡΠΈΠΊ */
5 } shared;
6 int
7 main(int argc, char **argv)
8 {
9 int fd, i, nloop;
10 struct shared *ptr;
11 if (argc != 3)
12 err_quit("usage: incr3 <pathname> <#loops>");
13 nloop = atoi(argv[2]);
14 /* ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ ΡΠ°ΠΉΠ», ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π½ΡΠ»Π΅ΠΌ, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌ Π² ΠΏΠ°ΠΌΡΡΡ */
15 fd = Open(argv[1], O_RDWR | O_CREAT, FILE_MODE);
16 Write(fd, &shared, sizeof(struct shared));
17 ptr = Mmap(NULL, sizeof(struct shared), PROT_READ | PROT_WRITE,
18 MAP_SHARED, fd, 0);
19 Close(fd);
20 /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°, ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ */
21 Sem_init(&ptr->mutex, 1, 1);
22 setbuf(stdout, NULL); /* stdout Π½Π΅ Π±ΡΡΠ΅ΡΠΈΠ·ΡΠ΅ΡΡΡ */
23 if (Fork() == 0) { /* Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ */
24 for (i = 0; i < nloop; i++) {
25 Sem_wait(&ptr->mutex);
26 printf("child: %d\n", ptr->count++);
27 Sem_post(&ptr->mutex);
28 }
29 exit(0);
30 }
31 /* ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ */
32 for (i = 0; i < nloop; i++) {
33 Sem_wait(&ptr->mutex);
34 printf("parent: %d\n", ptr->count++);
35 Sem_post(&ptr->mutex);
36 }
37 exit(0);
38 }
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ, Ρ ΡΠ°Π½ΡΡΠ΅ΠΉΡΡ Π² ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ2-5 ΠΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΉ ΡΡΠ΅ΡΡΠΈΠΊ ΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡ, Π·Π°ΡΠΈΡΠ°ΡΡΠΈΠΉ Π΅Π³ΠΎ, Π² ΠΎΠ΄Π½Ρ ΡΡΡΡΠΊΡΡΡΡ. ΠΡΠ° ΡΡΡΡΠΊΡΡΡΠ° Π±ΡΠ΄Π΅Ρ Ρ ΡΠ°Π½ΠΈΡΡΡΡ Π² ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ.
ΠΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌ Π² ΠΏΠ°ΠΌΡΡΡ14-19 Π‘ΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠ°ΠΉΠ» Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² ΠΏΠ°ΠΌΡΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΡΡΡΡΠΊΡΡΡΠΎΠΉ Ρ Π½ΡΠ»Π΅Π²ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΠΎΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ. ΠΡΠΈ ΡΡΠΎΠΌ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ΅ΡΡΠΈΠΊ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅ΠΌΠ°ΡΠΎΡ Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ sem_init. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΡΠΎΡΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΡ ΡΡΡΡΠΊΡΡΡΡ Π½ΡΠ»ΡΠΌΠΈ, ΡΠ΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅.
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°20-21 ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠ΅ΠΌΠ°ΡΠΎΡ, ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌΡΠΉ Π² ΠΏΠ°ΠΌΡΡΠΈ, Π²ΠΌΠ΅ΡΡΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ. ΠΠ»Ρ Π΅Π³ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅ΠΉ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ sem_init. ΠΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π½Π΅Π½ΡΠ»Π΅Π²ΡΠΌ, ΡΡΠΎΠ±Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΠΌΠΎΠ³ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ.
ΠΠ° ΡΠΈΡ. 12.7 ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π° ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΡΠΈΡ. 12.6, Π³Π΄Π΅ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΠ»ΡΡ ΠΈΠ· ΡΠ΄ΡΠ° Π² ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΡ ΠΏΠ°ΠΌΡΡΡ.
Π ΠΈΡ. 12.7. Π ΡΠ΅ΠΌΠ°ΡΠΎΡ, ΠΈ ΡΡΠ΅ΡΡΠΈΠΊ ΡΠ΅ΠΏΠ΅ΡΡ Ρ ΡΠ°Π½ΡΡΡΡ Π² ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ
12.4. ΠΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΠ°ΠΌΡΡΡ Π² 4.4BSD
ΠΠ°ΡΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³ΠΎΠ² 12.2 ΠΈ 12.3 ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΡΠ»ΠΈΡΠ½ΠΎ, Π½ΠΎ Π½Π°ΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ°ΠΉΠ» Π² ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ (Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ), Π²ΡΠ·ΡΠ²Π°ΡΡ open, Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π½ΡΠ»ΠΈ Π² ΡΠ°ΠΉΠ» Π²ΡΠ·ΠΎΠ²ΠΎΠΌ write (ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ). ΠΡΠ»ΠΈ mmap ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΎΠ±Π»Π°ΡΡΠΈ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΡΠ΅ΡΠ΅Π· fork, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΏΡΠΎΡΡΠΈΡΡ ΡΡΡ ΡΡ Π΅ΠΌΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
1. Π Π²Π΅ΡΡΠΈΠΈ 4.4BSD ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² ΠΏΠ°ΠΌΡΡΡ. ΠΡΠΈ ΡΡΠΎΠΌ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΡΠΎΠΏΠ°Π΄Π°Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΈΠ»ΠΈ ΠΎΡΠΊΡΡΠ²Π°ΡΡ ΡΠ°ΠΉΠ»Ρ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ ΡΠ»Π°Π³ΠΈ MAP_SHARED | MAP_ANON ΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ fd = β1. Π‘Π΄Π²ΠΈΠ³, Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ offset, ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ. ΠΠ°ΠΌΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ Π½ΡΠ»ΡΠΌΠΈ. ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 12.4.
2. Π Π²Π΅ΡΡΠΈΠΈ SVR4 ΠΈΠΌΠ΅Π΅ΡΡΡ ΡΠ°ΠΉΠ» /dev/zero, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ ΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ mmap. ΠΡΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΡΠ»ΠΈ ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ, Π° Π²Π΅ΡΡ Π½Π°ΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΉ Π½Π° Π½Π΅Π³ΠΎ Π²ΡΠ²ΠΎΠ΄ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ. ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 12.5. (ΠΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡ , ΠΏΡΠΎΠΈΠ·ΠΎΡΠ΅Π΄ΡΠΈΡ ΠΎΡ BSD, ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ /dev/zero, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π² SunOS 4.1.x ΠΈ BSD/OS 3.1.)
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 12.4 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΡΠ°ΡΡΡ Π»ΠΈΡΡΠΈΠ½Π³Π° 12.2, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π΅ ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² ΠΏΠ°ΠΌΡΡΡ Π² 4.4BSD.
ΠΠΈΡΡΠΈΠ½Π³ 12.4. ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΠ°ΠΌΡΡΡ Π² 4.4BSD//shm/incr_map_anon.Ρ
3 int
4 main(int argc, char **argv)
5 {
6 int i, nloop;
7 int *ptr;
8 sem_t *mutex;
9 if (argc != 2)
10 err_quit("usage: incr_map_anon <#loops>");
11 nloop = atoi(argv[1]);
12 /* ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΠ°ΠΌΡΡΡ */
13 ptr = Mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE,
14 MAP_SHARED | MAP_ANON, β1, 0);
6-11 ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ fd ΠΈ zero Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ, ΠΊΠ°ΠΊ ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, Π·Π°Π΄Π°Π²Π°Π²ΡΠΈΠΉ ΠΈΠΌΡ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°.
12-14 Π€Π°ΠΉΠ» Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΎΡΠΊΡΡΠ²Π°ΡΡ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΠ»Π°Π³ MAP_ANON ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ mmap, Π° ΠΏΡΡΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ (Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ) ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ β1.
12.5. ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΠ°ΠΌΡΡΡ Π² SVR4 Ρ ΠΏΠΎΠΌΠΎΡΡΡ /dev/zero
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 12.5 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΡΠ°ΡΡΡ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΡΠ΅ΡΠ΅ΡΠΏΠ΅Π²ΡΠ°Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ Π»ΠΈΡΡΠΈΠ½Π³ΠΎΠΌ 12.2 ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π΅ ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ /dev/zero.
ΠΠΈΡΡΠΈΠ½Π³ 12.5. ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ Π² SVR4 Ρ ΠΏΠΎΠΌΠΎΡΡΡ /dev/zero//shm/incr_dev_zero.c
3 int
4 main(int argc char **argv)
5 {
6 int fd, i, nloop;
7 int *ptr;
8 sem_t *mutex;
9 if (argc != 2)
10 err_quit("usage: incr_dev_zero <#loops>");
11 nloop = atoi(argv[1]);
12 /* ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ /dev/zero ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌ Π² ΠΏΠ°ΠΌΡΡΡ */
13 fd = Open("/dev/zero", O_RDWR);
14 ptr = Mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
15 Close(fd);
6-11 ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ zero Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, ΠΊΠ°ΠΊ ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, Π·Π°Π΄Π°Π²Π°Π²ΡΠΈΠΉ ΠΈΠΌΡ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°.
12-15 ΠΡ ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ ΡΠ°ΠΉΠ» /dev/zero ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ Π΅Π³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΈ mmap. ΠΠ±Π»Π°ΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ Π±ΡΠ΄Π΅Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π° Π½ΡΠ»ΡΠΌΠΈ.
12.6. ΠΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π½ΡΠΌ Π² ΠΏΠ°ΠΌΡΡΡ
ΠΠΎΠ³Π΄Π° Π² ΠΏΠ°ΠΌΡΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ (Π²ΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π²ΡΠ·ΠΎΠ²Π° mmap), ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ ΡΠ°ΠΉΠ»Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 12.3 ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ°ΠΉΠ»Π° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΠ°Π²Π½ΡΠΌ ΡΠ°Π·ΠΌΠ΅ΡΡ ΡΡΡΡΠΊΡΡΡΡ shared Π²ΡΠ·ΠΎΠ²ΠΎΠΌ write ΠΈ ΡΡΠΎ ΠΆΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΎΠ±Π»Π°ΡΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΡΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΈ Π΅Π³ΠΎ Π² ΠΏΠ°ΠΌΡΡΡ. ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠΈ Π΄Π²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° β ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ°ΠΉΠ»Π° ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΠ°ΠΌΡΡΠΈ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ½ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½, β ΠΌΠΎΠ³ΡΡ ΠΈ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ.
ΠΠ»Ρ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ mmap Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 12.6.
ΠΠΈΡΡΠΈΠ½Π³ 12.6. ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π°: ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ°ΠΉΠ»Π° ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΠ°ΠΌΡΡΠΈ//shra/test1.c
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
5 int fd, i;