10 for (;;) {
11 /* ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° IPC */
12 mesg.mesg_type = 1:
13 if ((n = Mesg_recv(readfd, &mesg)) == 0) {
14 err_msg("pathname missing");
15 continue;
16 }
17 mesg.mesg_data[n] = '\0'; /* ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΈΠΌΡ */
18 if ((ptr = strchr(mesg.mesg_data, ' ')) == NULL) {
19 err_msg("bogus request: %s", mesg.mesg_data);
20 continue;
21 }
22 *ptr++ =0; /* ptr = ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΈΠΌΡ */
23 pid = atol(mesg.mesg_data);
24 mesg.mesg_type = pid; /* Π΄Π»Ρ ΠΎΠ±ΡΠ°ΡΠ½ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ */
25 if ((fp = fopen(ptr, "r")) == NULL) {
26 /* 4error: must tell client */
27 snprintf(mesg.mesg_data + n, sizeof(mesg.mesg_data) β n,
28 ": can't open. %s\n", strerror(errno));
29 mesg.mesg_len β strlen(ptr);
30 memmove(mesg.mesg_data, ptr, mesg.mesg_len);
31 Mesg_send(writefd, &mesg);
32 } else {
33 /* ΡΠ°ΠΉΠ» ΠΎΡΠΊΡΡΡ, ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΡ */
34 while (Fgets(mesg.mesg_data, MAXMESGDATA, fp) != NULL) {
35 mesg.mesg_len = strlen(mesg.mesg_data);
36 Mesg_send(writefd, &mesg);
37 }
38 Fclose(fp);
39 }
40 /* ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½ΡΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅Ρ ΡΠ²ΡΠ·Ρ */
41 mesg.mesg_len = 0;
42 Mesg_send(writefd, &mesg);
43 }
44 }
ΠΠΈΡΡΠΈΠ½Π³ 6.14. Π€ΡΠ½ΠΊΡΠΈΡ main ΠΊΠ»ΠΈΠ΅Π½ΡΠ°//svmsgmpx1q/client_main.c
1 #include "svmsg.h"
2 void client(int, int);
3 int
4 main(int argc, char **argv)
5 {
6 int msqid;
7 /* ΡΠ΅ΡΠ²Π΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΠ» ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ */
8 msqid = Msgget(MQ_KEY1, 0);
9 client(msqid, msqid); /* ΠΎΠ΄Π½Π° ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π² ΠΎΠ±Π΅ ΡΡΠΎΡΠΎΠ½Ρ */
10 exit(0);
11 }
ΠΠΈΡΡΠΈΠ½Π³ 6.15. Π€ΡΠ½ΠΊΡΠΈΡ client//svmsgmpx1q/client.Ρ
1 #include "mesg.h"
2 void
3 client(int readfd, int writefd)
4 {
5 size_t len;
6 ssize_t n;
7 char *ptr;
8 struct mymesg mesg;
9 /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π±ΡΡΠ΅Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΈ ΠΏΡΠΎΠ±Π΅Π»ΠΎΠΌ */
10 snprintf(mesg.mesg_data, MAXMESGDATA. "%ld ", (long) getpid());
11 len = strlen(mesg.mesg_data);
12 ptr = mesg.mesg_data + len;
13 /* ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° */
14 Fgets(ptr, MAXMESGDATA β len, stdin);
15 len = strlen(mesg.mesg_data);
16 if (mesg.mesg_data[len-1] == '\n')
17 len--; /* ΡΠ΄Π°Π»ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ ΡΡΡΠΎΠΊΠΈ fgets() */
18 mesg.mesg_len = len;
19 mesg.mesg_type = 1;
20 /* Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ PID ΠΈ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° Π² ΠΊΠ°Π½Π°Π» IPC */
21 Mesg_send(writefd, &mesg);
22 /* ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° IPC, Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π² stdout */
23 mesg.mesg_type = getpid();
24 while ((n = Mesg_recv(readfd, &mesg)) > 0)
25 Write(STDOUT_FILENO, mesg.mesg_data, n);
26 }
ΠΡΠΈΠΌΠ΅Ρ: ΠΎΠ΄Π½Π° ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
ΠΠ·ΠΌΠ΅Π½ΠΈΠΌ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ Π²ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π»ΠΈΡΡ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ, Π½ΠΎ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΎΡΠ²Π΅ΡΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»Π°ΡΡ Π±Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΠ° ΡΠΈΡ. 6.3 ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π° ΡΡ Π΅ΠΌΠ° ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
Π ΠΈΡ. 6.3. ΠΠ΄Π½Π° ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π΄Π»Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
ΠΠ»ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ, Π° ΡΠ°ΠΌΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ²ΠΎΠΈ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Ρ ΠΊΠ»ΡΡΠΎΠΌ IPC_PRIVATE. ΠΠΌΠ΅ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΡΠΎΠΎΠ±ΡΠ°ΡΡ Π΅ΠΌΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠ²ΠΎΠ΅ΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ, Π² ΠΊΠΎΡΠΎΡΡΡ ΡΠ΅ΡΠ²Π΅Ρ Π½Π°ΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ²ΠΎΠΉ ΠΎΡΠ²Π΅Ρ. ΠΡΠΎΡ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠΌ: Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
ΠΡΠΈ ΡΠ°ΠΊΠΎΠΉ ΡΡ Π΅ΠΌΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠ»ΡΡΠ°Π΅ Β«Π³ΠΈΠ±Π΅Π»ΠΈΒ» ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠΎΠ³Π΄Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡΡΠ°Π½ΡΡΡΡ Π² Π΅Π³ΠΎ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π½Π°Π²ΡΠ΅Π³Π΄Π° (ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ Π΄ΠΎ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠ΄ΡΠ° ΠΈΠ»ΠΈ ΡΠ²Π½ΠΎΠ³ΠΎ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ).
ΠΠΈΠΆΠ΅ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ ΠΏΡΠ΅ΡΠ΅ΡΠΏΠ΅Π²Π°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΌΠΈ Π²Π΅ΡΡΠΈΡΠΌΠΈ:
β mesg.h (Π»ΠΈΡΡΠΈΠ½Π³ 4.12);
β svmsg.h (Π»ΠΈΡΡΠΈΠ½Π³ 6.7);
β ΡΡΠ½ΠΊΡΠΈΡ main ΡΠ΅ΡΠ²Π΅ΡΠ° (Π»ΠΈΡΡΠΈΠ½Π³ 6.12);
β ΡΡΠ½ΠΊΡΠΈΡ mesg_send (Π»ΠΈΡΡΠΈΠ½Π³ 4.13).
Π€ΡΠ½ΠΊΡΠΈΡ main ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 6.16; ΠΎΠ½Π° ΡΠ»Π΅Π³ΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π°ΡΡ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ Π»ΠΈΡΡΠΈΠ½Π³ΠΎΠΌ 6.14. ΠΡ ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° Ρ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΌ ΠΊΠ»ΡΡΠΎΠΌ (MQ_KEY1) ΠΈ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π½Π°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Ρ ΠΊΠ»ΡΡΠΎΠΌ IPC_PRIVATE. ΠΠ²Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΡΡΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ client (Π»ΠΈΡΡΠΈΠ½Π³ 6.17). ΠΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π΅Π³ΠΎ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΡΠ½Π°Ρ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠ΄Π°Π»ΡΠ΅ΡΡΡ.
ΠΠΈΡΡΠΈΠ½Π³ 6.16. Π€ΡΠ½ΠΊΡΠΈΡ main ΠΊΠ»ΠΈΠ΅Π½ΡΠ°//svmsgmpxnq/client_main.Ρ
1 #include "svmsg.h"
2 void client(int, int);
3 int
4 main(int argc, char **argv)
5 {
6 int readid, writeid;
7 /* ΡΠ΅ΡΠ²Π΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ */
8 writeid = Msgget(MQ_KEY1, 0);
9 /* ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ²ΠΎΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ */
10 readid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);
11 client(readid, writeid);
12 /* ΠΈ ΡΠ΄Π°Π»ΡΠ΅ΠΌ Π½Π°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ */
13 Msgctl(readid, IPC_RMID, NULL);
14 exit(0);
15 }
ΠΠΈΡΡΠΈΠ½Π³ 6.17. Π€ΡΠ½ΠΊΡΠΈΡ client//svmsgmpxnq/client.Ρ
1 #include "mesg.h"
2 void
3 client(int readid, int writeid)
4 {
5 size_t len;
6 ssize_t n;
7 char *ptr;
8 struct mymesg mesg;
9 /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π±ΡΡΠ΅Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΈ ΠΏΡΠΎΠ±Π΅Π»ΠΎΠΌ */
10 snprintf(mesg.mesg_data, MAXMESGDATA, "%d ", readid);
11 len = strlen(mesg.mesg_data);
12 ptr = mesg.mesg_data + len;
13 /* ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° */
14 Fgets(ptr, MAXMESGDATA β len, stdin);
15 len = strlen(mesg.mesg_data);
16 if (mesg.mesg_data[len-1] == '\n')
17 len--; /* ΡΠ΄Π°Π»ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ ΡΡΡΠΎΠΊΠΈ fgets() */
18 mesg.mesg_len = len;
19 mesg.mesg_type = 1;
20 /* ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΈ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° ΡΠ΅ΡΠ²Π΅ΡΡ */
21 Mesg_send(writeid, &mesg);
22 /* ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΠΎΡΠ²Π΅Ρ ΠΈΠ· Π½Π°ΡΠ΅ΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ Π² stdout */
23 while ((n = Mesg_recv(readid, &mesg)) > 0)
24 Write(STDOUT_FILENO, mesg.mesg_data, n);
25 }
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 6.17 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ client. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½Π° ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³Π° 6.15, Π½ΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π½Π° ΡΠ΅ΡΠ²Π΅Ρ Π½Π°ΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. Π’ΠΈΠΏ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΡΡΡΡΠΊΡΡΡΠ΅ mesg ΠΎΡΡΠ°Π΅ΡΡΡ ΡΠ°Π²Π½ΡΠΌ 1, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π΄Π»Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΡ Π² ΠΎΠ±Π΅ ΡΡΠΎΡΠΎΠ½Ρ.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 6.19 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ server. ΠΠ»Π°Π²Π½ΠΎΠ΅ ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π»ΠΈΡΡΠΈΠ½Π³Π° 6.13 Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΡΠΈΠΊΠ», Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ fork.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π° Π΄Π»Ρ SIGCHLD10 ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ, Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ·Π°Π±ΠΎΡΠΈΡΡΡΡ ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°Ρ -Π·ΠΎΠΌΠ±ΠΈ. Π ΡΠ°Π·Π΄Π΅Π»Π°Ρ 5.9 ΠΈ 5.10 [24] ΠΎΠ± ΡΡΠΎΠΌ Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ. ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π΄Π»Ρ ΡΠΈΠ³Π½Π°Π»Π° SIGCHLD, ΠΈ Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ sig_chld (Π»ΠΈΡΡΠΈΠ½Π³ 6.18) Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΏΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΠ°Π±ΠΎΡΡ Π΄ΠΎΡΠ΅ΡΠ½Π΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°.
12-18 ΠΠΎΡΠΎΠ΄ΠΈΠ²ΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ° Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ Π² Π²ΡΠ·ΠΎΠ²Π΅ mesg_recv, ΠΎΠΆΠΈΠ΄Π°Ρ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°.
25-45 ΠΡΠ·ΠΎΠ²ΠΎΠΌ fork ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅ΡΡΡ Π½ΠΎΠ²ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ ΠΏΠΎΠΏΡΡΠΊΡ ΠΎΡΠΊΡΡΡΡ Π·Π°ΠΏΡΠΎΡΠ΅Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π»ΠΈΠ±ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅, Π»ΠΈΠ±ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ°ΠΉΠ»Π°. ΠΡ ΠΏΡΠ΅Π΄Π½Π°ΠΌΠ΅ΡΠ΅Π½Π½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠ»ΠΈ Π²ΡΠ·ΠΎΠ² fopen Π² Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ, Π° Π½Π΅ Π² ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΅ΡΠ»ΠΈ ΡΠ°ΠΉΠ» Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅, Π΅Π³ΠΎ ΠΎΡΠΊΡΡΡΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π½ΡΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ Π½Π°Π»ΠΈΡΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΡΠ΅ΡΡΡ.
Π€ΡΠ½ΠΊΡΠΈΡ-ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π΄Π»Ρ SIGCHLD ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 6.18. ΠΠ½Π° ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½Π° Ρ Π»ΠΈΡΡΠΈΠ½Π³Π° 5.11 [24].
ΠΠΈΡΡΠΈΠ½Π³ 6.18. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° SIGCHLD, Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ waitpid//svmsgmpxnq/sigchldwaitpid.Ρ
1 #include "unpipc.h"
2 void
3 sig_chld(int signo)
4 {
5 pid_t pid;
6 int stat;
7 while ((pid = waitpid(-1, &stat, WNOHANG)) > 0);
8 return;
9 }
ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΡΠ·ΠΎΠ² waitpid Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΡΠ°ΡΡΡΠ° Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ Π²ΡΠ΅Ρ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ. ΠΠ°ΡΠ΅ΠΌ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π²ΠΎΠ·Π²ΡΠ°Ρ ΠΈΠ· ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π°. ΠΡΠΈ ΡΡΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡ Π±ΠΎΠ»ΡΡΡΡ ΡΠ°ΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π² Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ (ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ mesg_recv, Π»ΠΈΡΡΠΈΠ½Π³ 6.9). ΠΡΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΠΈΠ· ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΡΠΎΡ Π²ΡΠ·ΠΎΠ² msgrcv ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΡΡΡ. Π€ΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ Ρ ΠΊΠΎΠ΄ΠΎΠΌ EINTR, ΠΊΠ°ΠΊ ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 5.9 [24].
ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ°ΠΊΠΎΠΉ Π²ΠΎΠ·Π²ΡΠ°Ρ ΠΈΠ· Π²ΡΠ·Π²Π°Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΏΠΈΡΠ΅ΠΌ Π½ΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΡ-ΠΎΠ±Π΅ΡΡΠΊΡ Mesg_recv, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΡ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 6.20. ΠΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ Ρ ΠΊΠΎΠ΄ΠΎΠΌ EINTR ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ mesg_recv (ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅Ρ msgrcv), ΠΈ, Π΅ΡΠ»ΠΈ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΠΌΡ ΠΏΡΠΎΡΡΠΎ Π΅ΡΠ΅ ΡΠ°Π· Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ mesg_recv.
ΠΠΈΡΡΠΈΠ½Π³ 6.19. Π€ΡΠ½ΠΊΡΠΈΡ server//svmsgmpxnq/server.c