//svmsgcliserv/svmsg.h
1 #include "unpipc.h"
2 #define MQ_KEY1 1234L
3 #define MQ_KEY2 2345L
Π€ΡΠ½ΠΊΡΠΈΡ main Π΄Π»Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 6.8. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΎΠ±Π΅ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΠΈ Π½Π΅ Π±Π΅Π΄Π°, Π΅ΡΠ»ΠΈ ΠΊΠ°ΠΊΠ°Ρ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΈΠ· Π½ΠΈΡ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΡ Π½Π΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΡΠ»Π°Π³ IPC_EXCL. Π€ΡΠ½ΠΊΡΠΈΡ server Π΄Π°Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 4.16. ΠΠ½Π° Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π½Π°ΡΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ mesgsend ΠΈ mesgrecv, Π½ΠΎΠ²ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ΄ΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ Π½ΠΈΠΆΠ΅.
ΠΠΈΡΡΠΈΠ½Π³ 6.8. Π€ΡΠ½ΠΊΡΠΈΡ main ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ-ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅ΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ//svmsgcliserv/server_main.Ρ
1 #include "svmsg.h"
2 void server(int, int);
3 int
4 main(int argc, char **argv)
5 {
6 int readid, writeid;
7 readid = Msgget(MQ_KEY1, SVMSG_MODE | IPC_CREAT);
8 writeid = Msgget(MQ_KEY2, SVMSG_MODE | IPC_CREAT);
9 server(readid, writeid);
10 exit(0);
11 }
ΠΠΈΡΡΠΈΠ½Π³ 6.9. Π€ΡΠ½ΠΊΡΠΈΡ main ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ-ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅ΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ//svmsgcliserv/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 /* assumes server has created the queues */
8 writeid = Msgget(MQ_KEY1, 0);
9 readid = Msgget(MQ_KEY2, 0);
10 client(readid, writeid);
11 /* now we can delete the queues */
12 Msgctl(readid, IPC_RMID. NULL);
13 Msgctl(writeid, IPC_RMID, NULL);
14 exit(0);
15 }
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 6.9 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ main ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ-ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ Π΄Π²Π΅ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ client ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³Π° 4.15. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π΄Π²Π΅ Π΄ΡΡΠ³ΠΈΠ΅: mesg_send ΠΈ mesg_recv, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ Π½ΠΈΠΆΠ΅.
Π ΡΡΠ½ΠΊΡΠΈΡ client, ΠΈ ΡΡΠ½ΠΊΡΠΈΡ server ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠΎΡΠΌΠ°Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π½ΡΠΉ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 4.12. ΠΠ»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΈ ΠΏΡΠΈΠ΅ΠΌΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ mesg_send ΠΈ mesg_recv. Π‘ΡΠ°ΡΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠ΅ Π² Π»ΠΈΡΡΠΈΠ½Π³Π°Ρ 4.13 ΠΈ 4.14, Π²ΡΠ·ΡΠ²Π°Π»ΠΈ write ΠΈ read ΠΈ ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΌΠΈ ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ ΠΈ FIFO, ΡΠ°ΠΊ ΡΡΠΎ Π½Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°ΡΡ ΠΈΡ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. Π Π»ΠΈΡΡΠΈΠ½Π³Π°Ρ 6.10 ΠΈ 6.11 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ Π½ΠΎΠ²ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΊΠ°ΠΊ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° ΠΈΠ»ΠΈ FIFO, ΡΠ°ΠΊ ΠΈ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ.
ΠΠΈΡΡΠΈΠ½Π³ 6.10. Π€ΡΠ½ΠΊΡΠΈΡ mesg_send, ΡΠ°Π±ΠΎΡΠ°ΡΡΠ°Ρ Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ System V//svmsgcliserv/mesg_send.Ρ
1 #include "mesg.h"
2 ssize_t
3 mesg_send(int id, struct mymesg *mptr)
4 {
5 return(msgsnd(id, &(mptr->mesg_type), mptr->mesg_len, 0));
6 }
ΠΠΈΡΡΠΈΠ½Π³ 6.11. Π€ΡΠ½ΠΊΡΠΈΡ mesg_recv, ΡΠ°Π±ΠΎΡΠ°ΡΡΠ°Ρ Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ System V//svmsgcliserv/mesg_recv.Ρ
1 #include "mesg.h"
2 ssize_t
3 mesg_recv(int id, struct mymesg *mptr)
4 {
5 ssize_t n;
6 n = msgrcv(id, &(mptr->mesg_type), MAXMESGDATA, mptr->mesg_type, 0);
7 mptr->mesg_len = n; /* ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ Π΄Π°Π½Π½ΡΡ */
8 return(n); /* β1 Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ, 0 β ΠΊΠΎΠ½Π΅Ρ ΡΠ°ΠΉΠ»Π°, ΠΈΠ½Π°ΡΠ΅ β >0 */
9 }
6.8. ΠΡΠ»ΡΡΠΈΠΏΠ»Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
ΠΠ°Π»ΠΈΡΠΈΠ΅ ΠΏΠΎΠ»Ρ type Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄Π²Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ:
1. ΠΠΎΠ»Π΅ type ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ ΠΌΡΠ»ΡΡΠΈΠΏΠ»Π΅ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΡΠ΅ΡΠ²Π΅ΡΡ ΠΈΠΌΠ΅ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ°, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ ΠΈΠΌΠ΅ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ², ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΈΠΏΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°.
2. ΠΠΎΠ»Π΅ type ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ ΡΡΠΈΡΡΠ²Π°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅, ΠΎΡΠ»ΠΈΡΠ½ΠΎΠΌ ΠΎΡ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ Π΄Π»Ρ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ (FIFO). Π ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΡ ΠΊΠ°Π½Π°Π»Π°Ρ ΠΈ FIFO Π΄Π°Π½Π½ΡΠ΅ ΠΌΠΎΠ³Π»ΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ½ΠΈ Π±ΡΠ»ΠΈ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Ρ. ΠΡΠ΅ΡΠ΅Π΄ΠΈ System V ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΡΠΈΡΡΠ²Π°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΠΈΠΏΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ msgrcv Ρ ΡΠ»Π°Π³ΠΎΠΌ IPC_NOWAIT Π΄Π»Ρ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΡΠΈΠΏΠΎΠΌ ΠΈ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΡ Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΡΡΡΡΡΠ²ΠΈΡ ΡΠ°ΠΊΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ.
ΠΡΠΈΠΌΠ΅Ρ: ΠΎΠ΄Π½Π° ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
ΠΡΠΏΠΎΠΌΠ½ΠΈΡΠ΅ Π½Π°Ρ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ-ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ-ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ. ΠΡΠ»ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠ΅ ΠΊΠ°Π½Π°Π»Ρ ΠΈΠ»ΠΈ FIFO, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°Π»ΠΈΡΠΈΠ΅ Π΄Π²ΡΡ ΠΊΠ°Π½Π°Π»ΠΎΠ² IPC Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π°Π½Π½ΡΡ Π² ΠΎΠ±ΠΎΠΈΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΡ , ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΈ ΡΠΈΠΏΡ IPC ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠΌΠΈ. ΠΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΎΠ±ΠΎΠΈΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΡ , ΠΏΡΠΈΡΠ΅ΠΌ ΠΏΠΎΠ»Π΅ type ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ Π°Π΄ΡΠ΅ΡΠ°ΡΠ° (ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈΠ»ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°).
Π ΠΈΡ. 6.2. ΠΡΠ»ΡΡΠΈΠΏΠ»Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌΠΈ ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠ»ΠΎΠΆΠ½Π΅Π½Π½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ: ΠΎΠ΄ΠΈΠ½ ΡΠ΅ΡΠ²Π΅Ρ ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ². Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° 1, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΎΡ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΠ΅ΡΠ²Π΅ΡΡ. ΠΡΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠ΅ΡΠ²Π΅ΡΡ ΡΠ²ΠΎΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ°ΡΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΡΠ΅ΡΠ²Π΅Ρ ΡΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΡΠ»Π°ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π΅Π³ΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΈΠΏΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΉ PID Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° type ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ msgrcv. ΠΠ° ΡΠΈΡ. 6.2 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π΄Π»Ρ ΠΌΡΠ»ΡΡΠΈΠΏΠ»Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌΠΈ ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° IPC ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌΠΈ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π²ΡΠ΅Π³Π΄Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°Π²ΠΈΡΠ°Π½ΠΈΡ (deadlock). ΠΠ»ΠΈΠ΅Π½ΡΡ ΠΌΠΎΠ³ΡΡ (Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅) Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠ²ΠΎΠΈΠΌΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ, Π½Π΅ Π΄Π°Π²Π°Ρ ΡΠ΅ΡΠ²Π΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ ΠΎΡΠ²Π΅Ρ. Π ΡΡΠΎΠΌΡ ΡΠ»ΡΡΠ°Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΡΡΡΡΡ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ msgsnd, ΠΊΠ°ΠΊ ΠΈ ΡΠ΅ΡΠ²Π΅Ρ. ΠΠ΄Π½ΠΎ ΠΈΠ· ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΠΉ, ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°ΠΊΠΎΠΉ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΠ΅ΡΠ²Π΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠ΅Π³Π΄Π° ΠΎΡΠΊΠ»ΡΡΠ°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π·Π°ΠΏΠΈΡΠΈ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ.
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π΅Π»Π°ΡΡ Π½Π°Ρ ΠΏΡΠΈΠΌΠ΅Ρ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΎΠ΄Π½Ρ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ Π°Π΄ΡΠ΅ΡΠ°ΡΠΎΠ². ΠΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΠ΅: ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Ρ ΡΠΈΠΏΠΎΠΌ 1 Π°Π΄ΡΠ΅ΡΠΎΠ²Π°Π½Ρ ΡΠ΅ΡΠ²Π΅ΡΡ, Π° Π²ΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈΠΌΠ΅ΡΡ ΡΠΈΠΏ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π°Π΄ΡΠ΅ΡΠ°ΡΠ°. ΠΡΠΈ ΡΡΠΎΠΌ Π·Π°ΠΏΡΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π΅Π³ΠΎ PID Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΏΠΎΠ»Π½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 4.8.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 6.12 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ main ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» svmsg.h Π±ΡΠ» ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 6.7. Π‘ΠΎΠ·Π΄Π°Π΅ΡΡΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ (Π΅ΡΠ»ΠΈ ΠΎΠ½Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΠΎΡΠΈΠ±ΠΊΠΈ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ). ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΡΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ±ΠΎΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ server.
ΠΠΈΡΡΠΈΠ½Π³ 6.12. Π€ΡΠ½ΠΊΡΠΈΡ main ΡΠ΅ΡΠ²Π΅ΡΠ°//svmsgmpx1q/server_main.Ρ
1 #include "svmsg.h"
2 void server(int, int);
3 int
4 main(int argc, char **argv)
5 {
6 int msqid;
7 msqid = Msgget(MQ_KEY1, SVMSG_MODE | IPC_CREAT);
8 server(msqid, msqid); /* ΠΎΠ΄Π½Π° ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π² ΠΎΠ±Π΅ ΡΡΠΎΡΠΎΠ½Ρ */
9 exit(0);
10 }
Π€ΡΠ½ΠΊΡΠΈΡ server ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΠ΅ ΡΠ΅ΠΊΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 6.13. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ Π»ΠΈΡΡΠΈΠ½Π³Π° 4.10 β Π½Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ° FIFO, ΡΡΠΈΡΡΠ²Π°Π²ΡΠ΅Π³ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, ΡΠΎΡΡΠΎΡΠ²ΡΠΈΠ΅ ΠΈΠ· ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΈ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π°, β ΠΈ Π»ΠΈΡΡΠΈΠ½Π³Π° 4.16, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ mesg_send ΠΈ mesg_recv. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΉ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠΈΠΏΠ° Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ ΡΡΠΎΠΌΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΡΠΈΠΊΠ», Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΡΠΈΡΡΠ²Π°ΡΡΡΡ Π·Π°ΠΏΡΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΈ ΠΎΡΡΡΠ»Π°ΡΡΡΡ Π·Π°ΠΏΡΠΎΡΠ΅Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ. ΠΡΠΎΡ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΌ (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» 4.9).
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 6.14 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ main ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΠ»ΠΈΠ΅Π½Ρ ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΠ»Π° Π±ΡΡΡ ΡΠΎΠ·Π΄Π°Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π·Π°ΡΠ°Π½Π΅Π΅.
Π€ΡΠ½ΠΊΡΠΈΡ client, ΡΠ΅ΠΊΡΡ ΠΊΠΎΡΠΎΡΠΎΠΉ Π΄Π°Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 6.15, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π²ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³ΠΎΠ² 4.11 ΠΈ 4.15. Π ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΎΡΡΡΠ»Π°Π» ΡΠ²ΠΎΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΈ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°, Π° Π²ΠΎ Π²ΡΠΎΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ mesg_send ΠΈ mesg_recv. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΡΠΈΠΏ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ mesg_recv, ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°.
Π€ΡΠ½ΠΊΡΠΈΠΈ client ΠΈ server ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ mesg_send ΠΈ mesg_recv ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³ΠΎΠ² 6.9 ΠΈ 6.11.
ΠΠΈΡΡΠΈΠ½Π³ 6.13. Π€ΡΠ½ΠΊΡΠΈΡ server//svmsgmpx1q/server.c
1 #include "mesg.h"
2 void
3 server(int readfd, int writefd)
4 {
5 FILE *fp;
6 char *ptr;
7 pid_t pid;
8 ssize_t n;
9 struct mymesg mesg;
10 for (;;) {
11 /* ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° IPC */