1. ΠΠ΅ΡΠ²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° β ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊ. ΠΠ½Π° ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΊΠ°Π½Π°Π», Π΅ΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ, ΠΈ Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² Π½Π΅Π³ΠΎ Π΄Π°Π½Π½ΡΠ΅ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΡΡΡΠ΅Π΅.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠ²Π½ΡΠΉ, Π½Π°Ρ Π½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΠΈ ΠΌΡ Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΠΌΡΡ ΠΎΠ± ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π±ΡΡΠ΅ΡΠ°, Π ΠΎΠ±ΠΎΠΈΡ Π»ΠΈΡΡΠΈΠ½Π³Π°Ρ Π·Π°ΡΠ΅Π½Π΅Π½Π½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, Π²Π½Π΅ΡΠ΅Π½Π½ΡΠ΅ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ fifo2.c ΠΏΠΎΠΌΠΈΠΌΠΎ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π° ΡΠΎ Π²ΡΠ΅ΠΌΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ.
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>
#define FIFO_NAME "/tmp/my_fifo"
#define BUFFER_SIZE PIPE_BUF
#define TEN_MEG (1024 * 1024 * 10)
int main() {
int pipe_fd;
int res;
int open_mode = O_WRONLY;
int bytes_sent = 0;
char buffer[BUFFER_SIZE + 1];
if (access(FIFO_NAME, F_OK) == -1) {
res = mkfifo(FIFO_NAME, 0777);
if (res != 0) {
fprintf(stderr, "Could not create fifo %s\n", FIFO_NAME);
exit(EXIT_FAILURE);
}
}
printf("Process %d opening FIFO O_WRONLY\n", getpid());
pipe_fd = open(FIFO_NAME, open_name);
printf("Process %d result %d\n", getpid(), pipe_fd);
if (pipe_fd != -1) {
while (bytes_sent < TEN_MEG) {
res = write(pipe_fd, buffer, BUFFER_SIZE);
if (res == -1) {
fprintf(stderr, "Write error on pipe\n);
exit(EXIT_FAILURE);
}
bytes_sent += res;
}
(void)close(pipe_fd);
} else {
exit(EXIT_FAILURE);
}
printf("Process %d finished\n", getpid());
exit(EXIT_SUCCESS);
}
2. ΠΡΠΎΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, Π³ΠΎΡΠ°Π·Π΄ΠΎ ΠΏΡΠΎΡΠ΅. ΠΠ½Π° ΡΠΈΡΠ°Π΅Ρ ΠΈ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° FIFO.
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>
#define FIFO_NAME "/tmp/my_fifo"
#define BUFFER_SIZE PIPE_BUF
int main() {
int pipe_fd;
int res;
int open_mode = O_RDONLY;
char buffer[BUFFER_SIZE - 1];
int bytes_read = 0;
memset(buffer, '\0', sizeof(buffer));
printf("Process %d opening FIFO O_RDONLY\n", getpid());
pipe_fd = open(FIFO_NAME, open_mode);
printf("PrΠΎΡΠ΅ss %d result %d\n", getpid(), pipe_fd);
if (pipe_fd != -1) {
do {
res = read(pipe_fd, buffer,BUFFER_SIZE);
bytes_read += res;
} while (res > 0);
(void)close(pipe_fd);
} else {
exit(EXIT_FAILURE);
}
printf("Process %d finished, %d bytes read\n", getpid(), bytes_read);
exit(EXIT_SUCCESS);
}
ΠΠΎΠ³Π΄Π° Π²Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ time Π΄Π»Ρ Ρ ΡΠΎΠ½ΠΎΠΌΠ΅ΡΡΠ°ΠΆΠ° ΡΠΈΡΠ°ΡΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ (Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΠΌΠΈ Π΄Π»Ρ ΠΊΡΠ°ΡΠΊΠΎΡΡΠΈ) Π²ΡΠ²ΠΎΠ΄:
$ ./fifo3 &
[1] 375
Process 375 opening FIFO O_WRONLY
$ time ./fifo4
Process 377 opening FIFO O_RDONLY
Process 375 result 3
Process 377 result 3
Process 375 finished
Process 377 finished, 10485760 bytes read
real 0m0.053s
user 0m0.020s
sys 0m0.040s
[1]+ Done ./fifo3
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
ΠΠ±Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ FIFO Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ. ΠΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ fifo3 (ΠΏΠΈΡΡΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ/ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊ), ΠΊΠΎΡΠΎΡΠ°Ρ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ, ΠΎΠΆΠΈΠ΄Π°Ρ, ΠΊΠΎΠ³Π΄Π° ΡΠΈΡΠ°ΡΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΎΡΠΊΡΠΎΠ΅Ρ ΠΊΠ°Π½Π°Π» FIFO. ΠΠΎΠ³Π΄Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° fifo4 (ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ) Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ, ΠΏΠΈΡΡΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ ΠΈ Π½Π°ΡΠΈΠ½Π°Π΅Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΊΠ°Π½Π°Π». Π ΡΡΠΎ ΠΆΠ΅ Π²ΡΠ΅ΠΌΡ ΡΠΈΡΠ°ΡΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΡΡΠΈΡΡΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΊΠ°Π½Π°Π»Π°.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ΠΠ‘ Linux ΡΠ°ΠΊ ΠΎΡΠ³Π°Π½ΠΈΠ·ΡΠ΅Ρ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π²ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΡΡΠΎ ΠΎΠ½ΠΈ ΠΎΠ±Π° Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠ³ΡΡ, ΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Ρ Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΏΠΈΡΡΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΊΠ°Π½Π°Π» ΠΏΠΎΠ»ΠΎΠ½, Π° ΡΠΈΡΠ°ΡΡΠΈΠΉ β ΠΊΠΎΠ³Π΄Π° ΠΊΠ°Π½Π°Π» ΠΏΡΡΡ.
ΠΡΠ²ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Ρ time ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΡΠΈΡΠ°ΡΡΠ΅ΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΎΡΡ Π³ΠΎΡΠ°Π·Π΄ΠΎ ΠΌΠ΅Π½ΡΡΠ΅ ΠΎΠ΄Π½ΠΎΠΉ Π΄Π΅ΡΡΡΠΎΠΉ ΡΠ΅ΠΊΡΠ½Π΄Ρ Π΄Π»Ρ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ 10 ΠΠ±Π°ΠΉΡ Π΄Π°Π½Π½ΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡ. ΠΡΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΠ΅Π»ΡΡΡΠ²ΡΠ΅Ρ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΊΠ°Π½Π°Π»Ρ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π² ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π²Π΅ΡΡΠΈΡΡ Linux, ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ ΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½ΡΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌΠΈ.
ΠΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½Π°Ρ ΡΠ΅ΠΌΠ°: ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»ΠΎΠ² FIFO Π² ΠΊΠ»ΠΈΠ΅Π½Ρ-ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ
ΠΠ°ΠΊΠ°Π½ΡΠΈΠ²Π°Ρ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»ΠΎΠ² FIFO, Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ-ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΠ΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΊΠ°Π½Π°Π»Ρ. ΠΡ Ρ ΠΎΡΠΈΡΠ΅, ΡΡΠΎΠ±Ρ ΠΎΠ΄ΠΈΠ½ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π» Π·Π°ΠΏΡΠΎΡΡ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π» ΠΈΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π» ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Π΅ β ΠΊΠ»ΠΈΠ΅Π½ΡΡ.
ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ Π΄Π°Π½Π½ΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΡ. ΠΠ»Ρ ΠΏΡΠΎΡΡΠΎΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π·Π±ΠΈΡΡ Π½Π° Π±Π»ΠΎΠΊΠΈ, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΠΌΠ΅Π½ΡΡΠ΅ PIPE_BUF Π±Π°ΠΉΡΠΎΠ². ΠΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΠΊΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ, Π½ΠΎ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½, ΠΊΠ°ΠΊ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ ΠΊΠ°Π½Π°Π»ΠΎΠ².
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅ΡΠ²Π΅Ρ Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π±Π»ΠΎΠΊ Π΄Π°Π½Π½ΡΡ Π² ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΊΠ°ΠΆΠ΅ΡΡΡ Π»ΠΎΠ³ΠΈΡΠ½ΡΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΊΠ°Π½Π°Π» FIFO, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΈΡΠ°Π΅ΡΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ ΠΈ Π² ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π²ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ. ΠΡΠ»ΠΈ ΠΎΡΠΊΡΡΡΡ FIFO Π² Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ΅ΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅, ΡΠ΅ΡΠ²Π΅Ρ ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π±ΡΠ΄ΡΡ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡΡΡ.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅. ΠΠ°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΡΡ Π²ΡΠΎΡΠΎΠΉ ΠΊΠ°Π½Π°Π» Π΄Π»Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ Π΄Π°Π½Π½ΡΡ , ΠΎΠ΄ΠΈΠ½ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ (PID) ΠΏΡΠΎΡΠ΅ΡΡΠ°-ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π² ΠΈΡΡ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ , ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ, ΠΎΠ±Π΅ ΡΡΠΎΡΠΎΠ½Ρ ΡΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ°Π½Π°Π»Π° Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ.
ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 13.13.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 13.13. ΠΡΠΈΠΌΠ΅Ρ ΠΊΠ»ΠΈΠ΅Π½Ρ-ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ1. ΠΡΠ΅ΠΆΠ΄Π΅ Π²ΡΠ΅Π³ΠΎ, Π²Π°ΠΌ Π½ΡΠΆΠ΅Π½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» client.h, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π΄Π°Π½Π½ΡΠ΅, ΠΎΠ±ΡΠΈΠ΅ Π΄Π»Ρ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΡ ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ. Π ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΊΠΆΠ΅ Π΄Π»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° Π²ΠΊΠ»ΡΡΠ΅Π½Ρ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ.
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>
#define SERVER_FIFO_NAME "/tmp/serv_fifo"
#define CLIENT_FIFO_NAME "/tmp/cli_%d_fifo"
#define BUFFER_SIZE 20
struct data_to_pass_st {
pid_t client_pid;
char some_data[BUFFER_SIZE - 1];
};
2. Π’Π΅ΠΏΠ΅ΡΡ Π·Π°ΠΉΠΌΠ΅ΠΌΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ server.c. Π ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ Π²Ρ ΡΠΎΠ·Π΄Π°Π΅ΡΠ΅ ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΎΡΠΊΡΡΠ²Π°Π΅ΡΠ΅ ΠΊΠ°Π½Π°Π» ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΠ½ Π·Π°Π΄Π°Π΅ΡΡΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ "ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ" ΠΈ Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΎΠΉ. ΠΠΎΡΠ»Π΅ Π·Π°ΡΡΠΏΠ°Π½ΠΈΡ (ΠΈΠ· Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ) ΡΠ΅ΡΠ²Π΅Ρ ΡΠΈΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π΅ΡΡΡ ΡΡΡΡΠΊΡΡΡΠ° ΡΠΈΠΏΠ° data_to_pass_st.
#include "client.h"
#include <ctype.h>
int main() {
int server_fifo_fd, client fifo_fd;
struct data_to_pass_st my_data;
int read_res;
char client_fifo[256];
char *tmp_char_ptr;
mkfifo(SERVER_FIFO_NAME, 0777);
server_fifo_fd = open(SERVER_FIFO_NAME, O_RDONLY);
if (server_fifo_fd == -1) {
fprintf(stderr, "Server fifo failure\n");
exit(EXIT_FAILURE);
}
sleep(10); /* Π΄Π»Ρ ΡΠ΅Π»Π΅ΠΉ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ */
do {
read_res = read(server_fifo_fd, &my_data, sizeof(my_data));
if (read res > 0) {
3. ΠΠ° ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΡΠ°ΠΏΠ΅ Π²Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π΄Π°Π½Π½ΡΡ , ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°: ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΡΠ΅ Π²ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π΄Π°Π½Π½ΡΡ Π² ΠΏΡΠΎΠΏΠΈΡΠ½ΡΠ΅ ΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅ΡΠ΅ CLIENT_FIFO_NAME Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ client_pid.
tmp_char_ptr = my_data.some_data;
while (*tmp_char_ptr) {
*tmp_char_ptr = toupper(* tmp_char_ptr);
tmp_char_ptr++;
}
sprintf(client_fifo, CLIENT_FIFO_NAME, my_data.client_pid);
4. ΠΠ°Π»Π΅Π΅ ΠΎΡΠΏΡΠ°Π²ΡΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π½Π°Π·Π°Π΄, ΠΎΡΠΊΡΡΠ² ΠΊΠ°Π½Π°Π» ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ "ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ" ΠΈ Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΎΠΉ. Π Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΡΠΎΠΉΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠΉ FIFO Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π·Π°ΠΊΡΡΡΠΈΡ ΡΠ°ΠΉΠ»Π° ΠΈ ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ FIFO.
client_fifo_fd = open(client_fifo, O_WRONLY);
if (client_fifo_fd ! = -1) {
write(client_fifo_fd, &my_data, sizeof(my_data));
close(client_fifo_fd);
}
}
} while (read_res > 0);