Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <vector>
- #include <cassert> /** assert() */
- #include <sys/ipc.h>
- #include <sys/msg.h>
- #include <unistd.h> /** fork() */
- #include <sys/wait.h> /** wait() */
- #include <sys/sem.h>
- #include <string.h>
- #define CHILD 0
- using std::vector;
- using std::string;
- vector<string> text = {
- "Ошибается в мире каждый -",
- "И на солнце ведь пятна есть.",
- "Жизнь, как дом, многоэтажный -",
- "Тёмных окон в нём не счесть.",
- "Но есть люди, хоть раз споткнувшись,",
- "Прекращают вперёд идти,",
- "От мечты своей отвернувшись,",
- "Вдруг решают уйти с пути.",
- "И легко им потом живётся,",
- "Без падений на твёрдый пол,",
- "Белой нитью вся жизнь плетётся,",
- "Составляя один узор."
- };
- struct msg {
- long mtype; /* тип сообщения, должен быть > 0 */
- char mtext[80]; /* содержание сообщения */
- msg(const char *text) {
- mtype = 1;
- strncpy(mtext, text, 80);
- };
- };
- /**
- * Дочерний процесс
- * @param start - номер первой строки для текущего дочернего процесса
- */
- void thread(int semid, int msgqid, int start) {
- sembuf buf = { 0 };
- for (int i = start; i < 12; i += 4) {
- buf.sem_op = -i; // Для блокировки семафора нужен вес i
- int result = semop(semid, &buf, 1);
- assert(result != -1 && "Error: Can't lock semaphore");
- msg msg_obj(text[i].c_str());
- std::cout << "Отправили в очередь " << i << " строку" << std::endl;
- result = msgsnd(msgqid, &msg_obj, sizeof(msg_obj), IPC_NOWAIT);
- assert(result != -1 && "Error: Can't send message to IPC");
- buf.sem_op = i + 1;
- result = semop(semid, &buf, 1);
- assert(result != -1 && "Error: Can't increment semaphore");
- }
- }
- int main() {
- // Создаем семафор
- int semid = semget(IPC_PRIVATE, 1, 0600 | IPC_CREAT);
- assert(semid != -1 && "Error: can't get IPC");
- // Создаем очередь сообщений
- int msgqid = msgget(IPC_PRIVATE, 0600 | IPC_CREAT);
- assert(msgqid != -1 && "Error: can't get IPC");
- for (int i = 0; i < 4; i++) {
- int pid = fork();
- if (pid == CHILD) {
- thread(semid, msgqid, i);
- return 0;
- }
- }
- int status = 0;
- while ((wait(&status)) > 0);
- msg msg_obj("");
- for (int i = 0; i < 12; i++) {
- int result = msgrcv(msgqid, &msg_obj, sizeof(msg), 1, IPC_NOWAIT);
- assert(result != -1 && "Error: Can't read message to IPC");
- std::cout << msg_obj.mtext << std::endl;
- }
- return 0;
- }
Advertisement