Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π΄Π°Π½Π½ΡΡ Π² ΠΏpoΠ³ΡaΠΌΠΌΠ½ΡΠΉ ΠΊΠ°Π½Π°Π» ΠΈΠ»ΠΈ FIFO. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ°Π½Π°Π» ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΊΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ piΡΠ΅, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ΅ΠΉ ΠΎΡΠΊΡΡΡΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°, ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ³ΠΎ Ρ ΡΡΠΈΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ fdopen. ΠΠ°Π½Π°Π» FIFO ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΊΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ fopen.
ΠΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ β ΡΡΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΎΡΠ΅ΡΠ΅Π΄ΡΠΌΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΈ Π² Posix, ΠΈ Π² System V. ΠΡ Π²ΡΠΊΠΎΡΠ΅ ΡΠ·Π½Π°Π΅ΠΌ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ Π΄Π»ΠΈΠ½ΠΎΠΉ ΠΈ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠΌ (ΡΠΈΠΏΠΎΠΌ Π² System V). ΠΠ»ΠΈΠ½Π° ΠΈ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Π΅ΠΌ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ ΠΏΠΎΡΠ»Π΅ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΠ°ΠΆΠ΄ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π·Π°ΠΏΠΈΡΡ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π΄eΠΉΡaΠ³ΡaΠΌΠΌaΠΌ UDP ([24]).
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ ΠΏΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΌΡ ΠΊΠ°Π½Π°Π»Ρ ΠΈΠ»ΠΈ FIFO, ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ. ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² Π½Π°ΡΠ΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ mesg.h, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 4.12.
ΠΠΈΡΡΠΈΠ½Π³ 4.12. Π‘ΡΡΡΠΊΡΡΡΠ° mymesg ΠΈ ΡΠΎΠΏΡΡΡΡΠ²ΡΡΡΠΈΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ//pipemesg/mesg.h
1 #include "unpipc.h"
2 /* ΠΠ°ΡΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ "ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ", ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Ρ ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ, FIFO ΠΈ ΠΎΡΠ΅ΡΠ΅Π΄ΡΠΌΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ */
3 /* ΠΡ Ρ ΠΎΡΠΈΠΌ, ΡΡΠΎΠ±Ρ sizeof(struct mymesg) <= PIPE_BUF */
4 #define MAXMESGDATA (PIPE_BUF β 2*sizeof(long))
5 /* ΠΠ»ΠΈΠ½Π° mesg_len ΠΈ mesg_type */
6 #define MESGHDRSIZE (sizeof(struct mymesg) β MAXMESGDATA)
7 struct mymesg {
8 long mesg_len; //ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π°ΠΉΡΠΎΠ² Π² mesg_data, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π
9 long mesg_type;//ΡΠΈΠΏ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ > 0
10 char mesg_data[MAXMESGDATA];
11 };
12 ssize_t mesg_send(int, struct mymesg *);
13 void Mesg_send(int, struct mymesg *);
14 ssize_t mesg_recv(int, struct mymesg *);
15 ssize_t Mesg_recv(int, struct mymesg *);
ΠΠ°ΠΆΠ΄ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π² ΡΠ΅Π±Π΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ²ΠΎΠ΅ΠΌ ΡΠΈΠΏΠ΅ (mesg_type), ΠΏΡΠΈΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π½ΡΠ»Ρ. ΠΠΎΠΊΠ° ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΎ ΠΏΠΎΠ»Π΅ Π² Π·Π°ΠΏΠΈΡΠΈ, Π½ΠΎ Π²Π΅ΡΠ½Π΅ΠΌΡΡ ΠΊ Π½Π΅ΠΌΡ Π² Π³Π»Π°Π²Π΅ 6, Π³Π΄Π΅ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ System V. ΠΠ°ΠΆΠ΄ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ Π΄Π»ΠΈΠ½ΠΎΠΉ, ΠΊoΡopΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈ Π½ΡΠ»Π΅Π²ΠΎΠΉ. Π‘ΡΡΡΠΊΡΡΡΠ° mymesg ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΎ Π΅Π³ΠΎ ΡΠΈΠΏΠ΅ ΠΈ Π΄Π»ΠΈΠ½Π΅ Π²ΠΌΠ΅ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»Π° ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΡΡΠΎΠΊΠΈ Π΄Π»Ρ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠ½ΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. Π Π°Π½Π΅Π΅ ΠΌΡ ΠΎΡΠΌΠ΅ΡΠΈΠ»ΠΈ Π΄Π²Π° ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π°: ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠ΅ ΠΏΡΠΈΠ½ΡΡΡΠ΅ Π±Π°ΠΉΡΡ Π² ΠΏΠΎΠΈΡΠΊΠ°Ρ ΠΊΠΎΠ½ΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈ ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ Π² ΡΠ°ΠΌΠΈΡ Π΄Π°Π½Π½ΡΡ .
ΠΠ° ΡΠΈΡ. 4.13 ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ Π²ΠΈΠ΄ ΡΡΡΡΠΊΡΡΡΡ mymesg ΠΈ Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ, FIFO ΠΈ ΠΎΡΠ΅ΡΠ΅Π΄ΡΠΌΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ System V.
Π ΠΈΡ. 4.13. Π‘ΡΡΡΠΊΡΡΡΠ° mymesg
ΠΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ Π΄Π²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΈ ΠΏΡΠΈΠ΅ΠΌΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 4.13 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ mesg_send, Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 4.14 β ΡΡΠ½ΠΊΡΠΈΠΈ mesg_recv.
ΠΠΈΡΡΠΈΠ½Π³ 4.13. Π€ΡΠ½ΠΊΡΠΈΡ mesg_send//pipemesg/mesg_send.c
1 #include "mesg.h"
2 ssize_t
3 mesg_send(int fd, struct mymesg *mptr)
4 {
5 return(write(fd, mptr, MESGHDRSIZE + mptr->mesg_len));
6 }
ΠΠΈΡΡΠΈΠ½Π³ 4.14. Π€ΡΠ½ΠΊΡΠΈΡ mesg_recv//pipemesg/mesg_recv.c
1 #include "mesg.h"
2 ssize_t
3 mesg_recv(int fd, struct mymesg *mptr)
4 {
5 size_t len;
6 ssize_t n;
8 /* ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Ρ */
9 if ((n = Read(fd, mptr, MESGHDRSIZE)) == 0)
10 return(0); /* end of file */
11 else if (n != MESGHDRSIZE)
12 err_quit("message header: expected %d, got %d". MESGHDRSIZE, n);
13 if ((len = mptr->mesg_len) > 0)
14 if ((n = Read(fd, mptr->mesg_data, len)) != len)
15 err_quit("message data: expected %d, got %d", len, n);
16 return(len);
17 }
Π’Π΅ΠΏΠ΅ΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ read Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π΄Π²Π°ΠΆΠ΄Ρ: ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π΄Π»Ρ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ Π΄Π»ΠΈΠ½Ρ, Π° Π΄ΡΡΠ³ΠΎΠΉ β Π΄Π»Ρ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ ΡΠ°ΠΌΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ (Π΅ΡΠ»ΠΈ Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Π° Π±ΠΎΠ»ΡΡΠ΅ 0).
ΠΠ ΠΠΠΠ§ΠΠΠΠ
ΠΠ½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ mesg_recv ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π½Π°Π»ΠΈΡΠΈΠ΅ Π²ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΈ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈ ΠΈΡ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΌΡ Π²ΡΠ΅ ΠΆΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ-ΠΎΠ±Π΅ΡΡΠΊΡ Mesg_recv ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΠΈΠ· Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΅Π΅ β Π΄Π»Ρ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±ΡΠ°Π·ΠΈΡ.
ΠΠ·ΠΌΠ΅Π½ΠΈΠΌ ΡΠ΅ΠΏΠ΅ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ client ΠΈ server, ΡΡΠΎΠ±Ρ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π½ΠΎΠ²ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ mesg_send ΠΈ mesg_recv. Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 4.15 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ-ΠΊΠ»ΠΈΠ΅Π½ΡΠ°.
ΠΠΈΡΡΠΈΠ½Π³ 4.15. Π€ΡΠ½ΠΊΡΠΈΡ client Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ//pipemesg/client.c
1 #include "mesg.h"
2 void
3 client(int readfd, int writefd)
4 {
5 size_t len;
6 ssize_t n;
7 struct mymesg mesg;
8 /* ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ */
9 Fgets(mesg.mesg_data, MAXMESGDATA, stdin);
10 len = strlen(mesg.mesg_data);
11 if (mesg.mesg_data[len-1] == '\n')
12 len--; /* ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΡΡΠΎΠΊΠΈ ΠΈΠ· fgets() */
13 mesg.mesg_len = len;
14 mesg.mesg_type = 1;
15 /* Π·Π°ΠΏΠΈΡΡ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π² ΠΊΠ°Π½Π°Π» IPC */
16 Mesg_send(writefd, &mesg);
17 /* ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° IPC. Π·Π°ΠΏΠΈΡΡ Π² stdout */
18 while ( (n = Mesg_recv(readfd, &mesg)) > 0)
19 Write(STDOUT_FILENO, mesg.mesg_data, n);
20 }
Π‘ΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π° ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ° Π΅Π³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΡ8-16 ΠΠΎΠ»Π½ΠΎΠ΅ ΠΈΠΌΡ ΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ ΠΈΠ· ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π° ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ mesg_send.
Π‘ΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°17-19 ΠΠ»ΠΈΠ΅Π½Ρ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ mesg_recv Π² ΡΠΈΠΊΠ»Π΅, ΡΡΠΈΡΡΠ²Π°Ρ Π²ΡΠ΅ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡΠΈΠ΅ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΠΎ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΠ³Π΄Π° mesg_recv Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΡΠ»Π΅Π²ΡΡ Π΄Π»ΠΈΠ½Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΊΠΎΠ½Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π΄Π°Π½Π½ΡΡ . ΠΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΡΠ΅ΡΠ²Π΅Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠΈΠΌΠ²ΠΎΠ» ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΡΡΠΎΠΊΠΈ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΠΎΠΌΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΡΡΠ°Ρ ΡΡΡΠΎΠΊΠ° Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ Π΄Π»ΠΈΠ½Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ 1. Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 4.16 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ΅ΡΠ²Π΅ΡΠ°.
ΠΠΈΡΡΠΈΠ½Π³ 4.16. Π€ΡΠ½ΠΊΡΠΈΡ server, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ°Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ//pipemesg/server.c
1 #include "mesg.h"
2 void
3 server(int readfd, int writefd)
4 {
5 FILE *fp;
6 ssize_t n;
7 struct mymesg mesg;
8 /* ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° */
9 mesg.mesg_type = 1;
10 if ((n = Mesg_recv(readfd, &mesg)) == 0)
11 err_quit("pathname missing");
12 mesg.mesg_data[n] = '\0'; /* ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΈΠΌΡ, Π·Π°Π²Π΅ΡΡΠ°ΡΡΠ΅Π΅ΡΡ 0 */
13 if ((fp = fopen(mesg.mesg_data, "r")) == NULL) {
14 /* ΠΎΡΠΈΠ±ΠΊΠ°, Π½ΡΠΆΠ½ΠΎ ΡΠΎΠΎΠ±ΡΠΈΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ */
15 snprintf(mesg.mesg_data + n, sizeof(mesg.mesg_data) β n,
16 ": can't open, %s\n", strerror(errno));
17 mesg.mesg_len = strlen(mesg.mesg_data);
18 Mesg_send(writefd, &mesg);
19 } else {
20 /* ΡΠ°ΠΉΠ» ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΎΡΠΊΡΡΡ, ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° Π΄Π°Π½Π½ΡΡ */
21 while (Fgets(mesg.mesg_data, MAXMESGDATA, fp) != NULL) {
22 mesg.mesg_len = strlen(mesg.mesg_data);
23 Mesg_send(writefd, &mesg);
24 }
25 Fclose(fp);
26 }
27 /* ΠΎΡΠΏΡΠ°Π²ΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π½ΡΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ Π΄Π»Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ° ΡΠ²ΡΠ·ΠΈ */
28 mesg.mesg_len = 0;
29 Mesg_send(writefd, &mesg);
30 }
Π‘ΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π° ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° IPC, ΠΎΡΠΊΡΡΡΠΈΠ΅ ΡΠ°ΠΉΠ»Π°8-18 Π‘Π΅ΡΠ²Π΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°. Π₯ΠΎΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ mesg_type, ΡΠ°Π²Π½ΠΎΠ΅ 1, Π½ΠΈΠ³Π΄Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ (ΠΎΠ½ΠΎ Π·Π°ΡΠΈΡΠ°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ mesg_recv ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³Π° 4.14), ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡ ΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΡΠΌΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ System V (Π»ΠΈΡΡΠΈΠ½Π³ 6.8), Π° Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π² ΡΡΠΎΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠΈ ΡΠΆΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡ (ΡΠΌ., Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π»ΠΈΡΡΠΈΠ½Π³ 6.11). Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° fopen ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ ΡΠ°ΠΉΠ», ΡΡΠΎ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ Π»ΠΈΡΡΠΈΠ½Π³Π° 4.3, Π³Π΄Π΅ Π²ΡΠ·ΡΠ²Π°Π»Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ open Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° ΡΠ°ΠΉΠ»Π°. ΠΡΠΈΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ fopen, Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π² ΡΡΠΎΠΉ ΠΏpoΠ³ΡaΠΌΠΌe ΠΌΡ ΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ fgets Π΄Π»Ρ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΏΠΎΡΡΡΠΎΡΠ½ΠΎ ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΡΡΡΠΎΠΊΡ Π·Π° ΡΡΡΠΎΠΊΠΎΠΉ.
ΠΡΠΏΡΠ°Π²ΠΊΠ° ΡΠ°ΠΉΠ»Π° ΠΊΠ»ΠΈΠ΅Π½ΡΡ19-26 ΠΡΠ»ΠΈ Π²ΡΠ·ΠΎΠ² fopen ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠΏΠ΅ΡΠ½ΡΠΌ, ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ°ΠΉΠ»Π° ΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ fgets ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΏΠΎΡΡΡΠΎΡΠ½ΠΎ. Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ Π½ΡΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½ΠΎΠΉ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΊΠΎΠ½Π΅Ρ ΡΠ°ΠΉΠ»Π°.
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏpoΠ³ΡaΠΌΠΌΠ½Ρx ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΈΠ»ΠΈ FIFO ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΡΠ°ΠΊΠΆΠ΅ Π·Π°ΠΊΡΡΡΡ ΠΊΠ°Π½Π°Π» IPC, ΡΡΠΎΠ±Ρ Π΄Π°ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π·Π½Π°ΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΡΠ°ΠΉΠ»Π° Π·Π°Π²Π΅ΡΡΠ΅Π½Π°. ΠΠ΄Π½Π°ΠΊΠΎ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π½ΡΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΈΠΏΡ IPC Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ ΠΊΠΎΠ½ΡΠ° ΡΠ°ΠΉΠ»Π°.
Π€ΡΠ½ΠΊΡΠΈΠΈ main, Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠ΅ Π½ΠΎΠ²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ client ΠΈ server, Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΠΏΡΠ΅ΡΠ΅ΡΠΏΠ΅Π»ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΠΈΠ±ΠΎ Π²Π΅ΡΡΠΈΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ (Π»ΠΈΡΡΠΈΠ½Π³ 4.1), Π»ΠΈΠ±ΠΎ Π²Π΅ΡΡΠΈΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ FIFO (Π»ΠΈΡΡΠΈΠ½Π³ 4.6).
4.11. ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΡ ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΈ FIFO
ΠΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠ΅ ΠΊΠ°Π½Π°Π»Ρ ΠΈ ΠΊΠ°Π½Π°Π»Ρ FIFO ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡΡΡ Π²ΡΠ΅Π³ΠΎ Π΄Π²Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ:
β OPEN_MAX β ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡΠΊΡΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ (Posix ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π΄Π»Ρ ΡΡΠΎΠΉ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ½ΠΈΠ·Ρ β 16);
β PIPE_BUF β ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π°Π½Π½ΡΡ , Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅ΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π°ΠΏΠΈΡΠΈ (ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 4.7; Posix ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΠΎ ΠΌΠ΅Π½ΡΡΠ΅ΠΉ ΠΌΠ΅ΡΠ΅ 512 Π±Π°ΠΉΡ).