ΠΠ΅ΡΠ²ΡΠΉ ΠΈΠ· Π½ΠΈΡ ΠΏΡΡΠ°Π΅ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π½Π° Π·Π°ΠΏΠΈΡΡ (ΠΈ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ» Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π°), Π° Π²ΡΠΎΡΠΎΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ΅ΠΊΡΠ½Π΄Ρ ΡΠΏΡΡΡΡ ΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅. ΠΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΠ° ΡΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π° Π½Π° ΡΠΈΡ. 9.2, Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 9.6 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ Π½Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
Π ΠΈΡ. 9.2. ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈΠ²ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π½Π° Π·Π°ΠΏΠΈΡΡ
//lock/test2.c
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
5 int fd;
6 fd = Open("test1.data", O_RDWR | O_CREAT, FILE_MODE);
7 Read_lock(fd, 0, SEEK_SET, 0); /* ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π²Π΅ΡΡ ΡΠ°ΠΉΠ» Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ */
8 printf("%s: parent has read lock\n", Gf_time());
9 if (Fork() == 0) {
10 /* ΠΏΠ΅ΡΠ²ΡΠΉ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ */
11 sleep(1);
12 printf("%s: first child tries to obtain write lock\n", Gf_time());
13 Writew_lock(fd, 0, SEEK_SET, 0); /* Π·Π΄Π΅ΡΡ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ */
14 printf("%s: first child obtains write lock\n", Gf_time());
15 sleep(2);
16 Un_lock(fd, 0, SEEK_SET, 0);
17 printf("ls: first child releases write lock\n", Gf_time());
18 exit(0);
19 }
20 if (Fork() == 0) {
21 /* Π²ΡΠΎΡΠΎΠΉ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ */
22 sleep(3);
23 printf("%s: second child tries to obtain read lock\n", Gf_time());
24 Readw_lock(fd, 0, SEEK_SET, 0);
25 printf("%s: second child obtains read lock\n", Gf_time());
26 sleep(4);
27 Un_lock(fd, 0, SEEK_SET, 0);
28 printf("%s: second child releases read lock\n", Gf_time());
29 exit(0);
30 }
31 /* ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ */
32 sleep(5);
33 Un_lock(fd, 0, SEEK_SET, 0);
34 printf("%s: parent releases read lock\n", Gf_time());
35 exit(0);
36 }
Π ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ ΡΠ°ΠΉΠ» ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅6-8 Π ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ ΡΠ°ΠΉΠ» ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π° ΡΠ΅Π»ΠΈΠΊΠΎΠΌ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ read_lock (ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ Π² ΡΠ»ΡΡΠ°Π΅ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ ΡΠ΅ΡΡΡΡΠ°), Π° Π½Π΅ readw_lock (ΠΊΠΎΡΠΎΡΠ°Ρ ΠΆΠ΄Π΅Ρ Π΅Π³ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ), ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, ΡΡΠΎ ΡΡΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π±ΡΠ΄Π΅Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. ΠΡ ΡΠ°ΠΊΠΆΠ΅ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ gf_time [24, Ρ. 404], ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ.
ΠΠ΅ΡΠ²ΡΠΉ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ9-19 ΠΠΎΡΠΎΠΆΠ΄Π°Π΅ΡΡΡ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΆΠ΄Π΅Ρ 1 ΡΠ΅ΠΊΡΠ½Π΄Ρ ΠΈ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π½Π° Π·Π°ΠΏΠΈΡΡ Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π°. ΠΠ°ΡΠ΅ΠΌ ΠΎΠ½ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, ΠΆΠ΄Π΅Ρ 2 ΡΠ΅ΠΊΡΠ½Π΄Ρ, ΡΠ½ΠΈΠΌΠ°Π΅Ρ Π΅Π΅ ΠΈ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ.
ΠΡΠΎΡΠΎΠΉ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ20-30 ΠΠΎΡΠΎΠΆΠ΄Π°Π΅ΡΡΡ Π²ΡΠΎΡΠΎΠΉ ΠΏΡΠΎΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΆΠ΄Π΅Ρ 3 ΡΠ΅ΠΊΡΠ½Π΄Ρ, Π΄Π°Π²Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π½Π° Π·Π°ΠΏΠΈΡΡ, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π°. ΠΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ readw_lock ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ·Π½Π°ΡΡ, Π±ΡΠ» Π»ΠΈ ΡΠ΅ΡΡΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΈΠ»ΠΈ Π²ΡΠΎΡΠΎΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΆΠ΄Π°ΡΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ. ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΠ½ΠΈΠΌΠ°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ΅ΡΡΡΠ΅ ΡΠ΅ΠΊΡΠ½Π΄Ρ.
Π ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΡΠ΅ΡΡΡΡ 5 ΡΠ΅ΠΊΡΠ½Π΄31-35 Π ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΆΠ΄Π΅Ρ ΠΏΡΡΡ ΡΠ΅ΠΊΡΠ½Π΄, ΡΠ½ΠΈΠΌΠ°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΠΈ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ.
ΠΠ° ΡΠΈΡ. 9.2 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π²ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΠ° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² Solaris 2.6, Digital Unix 4.0B ΠΈ BSD/OS 3.1. ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ, Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π²ΡΠΎΡΠΎΠΌΡ Π΄ΠΎΡΠ΅ΡΠ½Π΅ΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π·Π°ΠΏΡΠΎΡΠ° Π½Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π·Π°ΠΏΠΈΡΠΈ. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ, ΡΡΠΎ Π·Π°ΠΏΡΠΎΡ Π½Π° Π·Π°ΠΏΠΈΡΡ ΡΠ°ΠΊ ΠΈ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½, Π΅ΡΠ»ΠΈ Π±ΡΠ΄ΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΏΠΎΡΡΡΠΏΠ°ΡΡ Π½ΠΎΠ²ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅. ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π² ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ ΠΏΡΡΡΡΠ΅ ΡΡΡΠΎΠΊΠΈ Π΄Π»Ρ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΠΈ:
alpha % test2
16:32:29.674453: parent has read lock
16:32:30.709197: first child tries to obtain write lock
16:32:32.725810: second child tries to obtain read lock
16:32:32.728739: second child obtains read lock
16:32:34.722282: parent releases read lock
16:32:36.729738: second child releases read lock
16:32:36.735597: first child obtains write lock
16:32:38.736938: first child releases write lock
ΠΡΠΈΠΌΠ΅Ρ: ΠΈΠΌΠ΅ΡΡ Π»ΠΈ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡΡ Π½Π° Π·Π°ΠΏΠΈΡΡ ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΠΎΡΠ°ΠΌΠΈ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅?
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΠΎΠΏΡΠΎΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΏΠΎΠΏΡΡΠ°Π΅ΠΌΡΡ Π΄Π°ΡΡ ΠΎΡΠ²Π΅Ρ, ΡΠ°ΠΊΠΎΠ²: Π΅ΡΡΡ Π»ΠΈ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ Ρ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π½Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π·Π°ΠΏΠΈΡΠΈ ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΠΎΡΠ°ΠΌΠΈ Π½Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΡΠ΅Π½ΠΈΡ, Π΅ΡΠ»ΠΈ Π²ΡΠ΅ ΠΎΠ½ΠΈ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ? ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠΈ ΡΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉ ΠΈ ΠΏΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉ ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΡΡΠΎ.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 9.7 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ Π½Π°ΡΠ΅ΠΉ ΡΠ΅ΡΡΠΎΠ²ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π° Π½Π° ΡΠΈΡ. 9.3 β Π²ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΠ° Π΅Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
ΠΠΈΡΡΠΈΠ½Π³ 9.7. ΠΡΡΡ Π»ΠΈ Ρ ΠΏΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄ ΡΠΈΡΠ°ΡΠ΅Π»ΡΠΌΠΈ//lock/test3.c
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
5 int fd;
6 fd = Open("test1.data", O_RDWR | O_CREAT, FILE_MODE);
7 Write_lock(fd, 0, SEEK_SET, 0); /* ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π²Π΅ΡΡ ΡΠ°ΠΉΠ» Π½Π° Π·Π°ΠΏΠΈΡΡ */
8 printf("ls: parent has write lock\n", Gf_time());
9 if (Fork() == 0) {
10 /* ΠΏΠ΅ΡΠ²ΡΠΉ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ */
11 sleep(1);
12 printf("ls: first child tries to obtain write lock\n", Gf_time());
13 Writew_lock(fd, 0, SEEK_SET, 0); /* Π·Π΄Π΅ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ Π±ΡΠ΄Π΅Ρ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ */
14 printf("%s: first child obtains write lock\n", Gf_time());
15 sleep(2);
16 Un_lock(fd, 0, SEEK_LET, 0);
17 printf("ls: first child releases write lock\n", Gf_time());
18 exit(0);
19 }
20 if (Fork() == 0) {
21 /* Π²ΡΠΎΡΠΎΠΉ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ */
22 sleep(3);
23 printf("ls: second child tries to obtain read lock\n", Gf_time());
24 Readw_lock(fd, 0, SEEK_SET, 0);
25 printf(%s: second child obtains read lock\n", Gf_time());
26 sleep(4);
27 Un_lock(fd, 0, SEEK_SET, 0);
28 printf("ls: second child releases read lock\n", Gf_time());
29 exit(0);
30 }
31 /* ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ */
32 sleep(5);
33 Un_lock(fd, 0, SEEK_SET, 0);
34 printf("ls: parent releases write lock\n", Gf_time());
35 exit(0);
36 }
Π ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ°ΠΉΠ» ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π½Π° Π·Π°ΠΏΠΈΡΡ6-8 Π ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ°ΠΉΠ» ΠΈ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π΅Π³ΠΎ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ Π½Π° Π·Π°ΠΏΠΈΡΡ.
ΠΠ΅ΡΠ²ΡΠΉ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ9-19 ΠΠΎΡΠΎΠΆΠ΄Π°Π΅ΡΡΡ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΆΠ΄Π΅Ρ ΠΎΠ΄Π½Ρ ΡΠ΅ΠΊΡΠ½Π΄Ρ, Π° Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π½Π° Π·Π°ΠΏΠΈΡΡ Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π°. ΠΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡ Π±ΡΠ΄Π΅Ρ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ» Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΠΈ ΡΠ½ΠΈΠΌΠ΅Ρ Π΅Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π· ΠΏΡΡΡ ΡΠ΅ΠΊΡΠ½Π΄, ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ, ΡΡΠΎΠ±Ρ ΡΡΠΎΡ Π·Π°ΠΏΡΠΎΡ Π±ΡΠ» ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ.
ΠΡΠΎΡΠΎΠΉ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ20-30 ΠΠΎΡΠΎΠΆΠ΄Π°Π΅ΡΡΡ Π²ΡΠΎΡΠΎΠΉ ΠΏΡΠΎΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΆΠ΄Π΅Ρ ΡΡΠΈ ΡΠ΅ΠΊΡΠ½Π΄Ρ, Π° Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° Π²Π΅ΡΡ ΡΠ°ΠΉΠ». ΠΡΠΎΡ Π·Π°ΠΏΡΠΎΡ Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ.
Π Π² Solaris 2.6, ΠΈ Π² Digital Unix 4.0B ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π½Π° Π·Π°ΠΏΠΈΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ, ΠΊΠ°ΠΊ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΎ Π½Π° ΡΠΈΡ. 9.3. ΠΠΎ ΡΡΠΎ Π΅ΡΠ΅ Π½Π΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Ρ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π½Π° Π·Π°ΠΏΠΈΡΡ Π΅ΡΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΠΎΡΠ°ΠΌΠΈ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠ΄ΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π²Π½Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΎΠ³ΠΎ, Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΠ½Π° ΠΈΠ»ΠΈ Π½Π° Π·Π°ΠΏΠΈΡΡ. Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΡΠΎ, ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π΅ΡΠ΅ ΠΎΠ΄Π½Ρ ΡΠ΅ΡΡΠΎΠ²ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 9.7, Π½ΠΎ Π² Π½Π΅ΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· ΠΎΠ΄Π½Ρ ΡΠ΅ΠΊΡΠ½Π΄Ρ, Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π½Π° Π·Π°ΠΏΠΈΡΡ β ΡΠ΅ΡΠ΅Π· ΡΡΠΈ ΡΠ΅ΠΊΡΠ½Π΄Ρ. ΠΡΠΈ Π΄Π²Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΡΡ, ΡΡΠΎ Solaris ΠΈ Digital Unix ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π²Π½Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΈΠΏΠ° Π·Π°ΠΏΡΠΎΡΠ°. ΠΠ΄Π½Π°ΠΊΠΎ Π² BSD/OS 3.1 ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅.
Π ΠΈΡ. 9.3. ΠΡΡΡ Π»ΠΈ Ρ ΠΏΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄ ΡΠΈΡΠ°ΡΠ΅Π»ΡΠΌΠΈ
ΠΠΎΡ Π²ΡΠ²ΠΎΠ΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³Π° 9.7, Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π±ΡΠ»Π° ΡΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π²ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄ΠΈaΠ³ΡaΠΌΠΌa Π½Π° ΡΠΈΡ. 9.3:
alpha % test3
16:34:02.810285: parent has write lock
16:34:03.848166: first child tries to obtain write lock
16:34:05.861082: second child tries to obtain read lock
16:34:07.858393: parent releases write lock
16:34:07.865222: first child obtains write lock
16:34:09.865987: first child releases write lock
16:34:09.872823: second child obtains read lock
16:34:13.873822: second child releases read lock
9.7. ΠΠ°ΠΏΡΡΠΊ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π΄Π΅ΠΌΠΎΠ½Π°
Π§Π°ΡΡΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏpoΠ³ΡaΠΌΠΌΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π΅ΠΌΠΎΠ½Π°) Π² Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ΅. Π€ΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π°, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 9.8, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ Π΄Π΅ΠΌΠΎΠ½Π°.
ΠΠΈΡΡΠΈΠ½Π³ 9.8. ΠΠ°ΡΠ°Π½ΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ//lock/onedaemon.c
1 #include "unpipc.h"
2 #define PATH_PIDFILE "pidfile"
3 int
4 main(int argc, char **argv)
5 {
6 int pidfd;
7 char line[MAXLINE];