/
bvs22
/
eltex
Обзор
Документация
Войти
/
bvs22
/
eltex
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
10-pipe_msg/msg.c
124 строки
3 KB
Batomunkuev Vladimir
Добавлены Изменения
30 янв 2025, 12:58
30 янв 2025, 12:58
1131992
Код
Авторство
О чём код?
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> #include <string.h> #include <time.h> #include <sys/msg.h> #include <sys/ipc.h> #define N 1000 // Количество сообщений // Структура сообщений struct msgbuf { long mtype; int mtext; }; int main() { pid_t pid; key_t key; int msqid = msgget(key, 0666 | IPC_CREAT); double res; const char *name_file = "msg"; FILE *file; struct msgbuf message; struct timespec start, end; // Создание очереди сообщений if (msqid == -1) { perror("msgget"); return 1; } // Создание файла для записи file = fopen(name_file, "w"); if (file == NULL) { perror("fopen"); return 1; } fclose(file); // Закрытие файла key = ftok("msg", 65); if (key == -1) { perror("ftok"); return 1; } printf("Очередь сообщений создана с идентификатором: %d\n", msqid); // Создание дочернего процесса pid = fork(); if (pid == -1) { perror("fork"); return 1; } else if (pid == 0) { clock_gettime(CLOCK_MONOTONIC, &start); // Старт подсечта времени записи printf("Начало записи.\n"); for (int i = 0; i < N; i++) // Запись сообщений в очередь сообщений и вывод первых пяти сообщений { message.mtype = 1; message.mtext = i; if (msgsnd(msqid, &message, sizeof(message), 0) == -1) { perror("msgsnd"); return 1; } if (i < 5) { printf("Записано: %d\n", message.mtext); } } printf("Конец записи.\n"); clock_gettime(CLOCK_MONOTONIC, &end); // Конец подсечта времени записи res = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1000000000.0; // Подсчет итогового времени printf("Время записи: %f\n", res); exit(0); } else { clock_gettime(CLOCK_MONOTONIC, &start); // Старт подсечта времени чтения printf("Начало чтения.\n"); for (int i = 0; i < N; i++) // Чтение сообщений из очереди и вывод первых пяти сообщений { if (msgrcv(msqid, &message, sizeof(message), 1, 0) == -1) { perror("msgrcv"); return 1; } if (i < 5) { printf("Прочитано: %d\n", message.mtext); } } printf("Конец чтения.\n"); clock_gettime(CLOCK_MONOTONIC, &end); // Конец подсечта времени чтения res = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1000000000.0; // Подсчет итогового времени printf("Время чтения: %f\n", res); waitpid(pid, NULL, 0); if (msgctl(msqid, IPC_RMID, NULL) == -1) // Удаление очереди { perror("msgctl"); return 1; } } return 0; }