Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 4
1

Многопроцессное приложение (метод синхронизации - семафоры) на С++ linux!

23.12.2015, 13:53. Показов 1568. Ответов 0

Author24 — интернет-сервис помощи студентам
Необходимо разработать многопроцессное приложение. Исходный процесс является управляющим, принимает поток ввода с клавиатуры и контролирует дочерние процессы. По нажатию клавиши ‘+’ добавляется новый процесс, ‘-’ – удаляется последний добавленный, ‘q’ – программа завершается. Каждый дочерний процесс посимвольно выводит на экран в вечном цикле свою уникальную строку. При этом операция вывода строки должна быть атомарной, т.е. процесс вывода должен быть синхронизирован таким образом, чтобы строки на экране не перемешивались. В качестве метода синхронизации следует использовать сигналы/события.
Не работает. Поправьте, пожалуйста, уже 2 дня голову ломаю над задачей!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/wait.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <ncurses.h>
 
#define MAX_COUNT 10
#define KEY 1147
 
 
 
char strings[10][30] =
{
    {"\r\nFirst process"},{"\r\nSecond process"}, {"\r\nThird process"}, {"\r\nFourth process"},
    {"\r\nFifth process"} ,{"\r\nSixth process"},{"\r\nSeventh process"},{"\r\nEighth process"},
    {"\r\nNinth process"},{"\r\nTenth process"},
};
 
int main(void)
{
    pid_t childPid[MAX_COUNT];
    int sizeOfProcess = 0;
    int flag = 1;
    int flagOfPrint = 0;
 
    key_t key;
    int semid;
    struct sembuf lockResurs;
    struct sembuf returnResurs;
 
    /*создать только один семафор*/
    if((semid = semget(KEY, 1, 0666 | IPC_CREAT)) < 0)
    {
        std::cout << "Can't get semid: ";
        perror("ftok");
        std::cout << std::endl;
        exit(-1);
    }
 
    /*заполним структуры семафора*/
    lockResurs.sem_num = 0;
    lockResurs.sem_op = -1;
    lockResurs.sem_flg = 0;
 
    returnResurs.sem_num = 0;
    returnResurs.sem_op = 1;
    returnResurs.sem_flg = 0;
 
    ///////////////ncurses/////////////////
      initscr();//переход в curses режим
      clear();//очиска экрана
      noecho();//печатные символы не отображаются
      refresh();//проверяет буфер и если он не пуст-отправляет информацию на экран
    ///////////////////////////////////////
 
      childPid[0] = getpid(); //сохраняем PID родителя
 
      ("Нажмите '+' для добавления процесса, '-' для его удаления и 'q'  для выхода из программы.\n");
      char c = NULL;
      while(c!='q')
      {
          switch(c=getchar())
              {
                  case '+'://если хотим добавить процесс
                  {
                      if(sizeOfProcess < MAX_COUNT)
                          sizeOfProcess++;
 
                          if((childPid[sizeOfProcess] = fork()) < 0)
                          {
                              std::cout << "Can't add process: ";
                              perror("fork");
                              std::cout << std::endl;
                              exit(-1);
                          }
 
                          else if(childPid[sizeOfProcess] == 0) //дочерний процесс
                          {
                              while(!flag)
                              {
                                  sleep(1);
 
                                  if(flagOfPrint)//если есть разрешение на печать
                                  {
                                      for(int i = 0; i < strlen(strings[sizeOfProcess - 1]); i++)
                                      {
                                          std::cout << strings[sizeOfProcess - 1] << " ";
                                          semop(semid, &lockResurs, 1);
                                          refresh();
                                          sleep(1);
                                      }
 
                                      flagOfPrint = 0;
                                      refresh();
                                      sleep(1);
                                  }
 
                              }
                          }
                  }
                  break;
 
                  case '-'://если хотим удалить процесс
                  {
                      if(sizeOfProcess == 0)
                          break;
 
                      waitpid(childPid[sizeOfProcess], NULL, 0);
                      sizeOfProcess--;
                  }
                  break;
              }
 
          if(flag && sizeOfProcess > 0)
          {
              flag = 0;
              semop(semid, &returnResurs, 1);
          }
 
          refresh();
      }
 
      //завершаем все дочерние процессы
      if(childPid[sizeOfProcess] != 0)
      {
          for(; sizeOfProcess > 0; sizeOfProcess--)
              waitpid(childPid[sizeOfProcess], NULL, 0);
 
          semctl(semid, 0, IPC_RMID);
      }
 
      clear();
      endwin();//выход из режима curses
 
      return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2015, 13:53
Ответы с готовыми решениями:

Семафоры: многопроцессное построение последовательности Фибоначчи
Добрый вечер. Подскажите, пожалуйста, как реализовать следующую программу на Си: Процессы строят...

Объекты синхронизации. мьютексы, семафоры
помогите пожалуйста. . Реализовать на семафоре мьютекс. Количественные характеристики мьютекса...

Многопроцессное приложение
Цель задания Написать программу, которая реализует поиск заданной последовательности символов в...

Отладить многопроцессное приложение
задача состоит в том чтобы на писать многопроцессное приложение моделирующее управление движением...

0
23.12.2015, 13:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2015, 13:53
Помогаю со студенческими работами здесь

Понятие синхронизации потоков и процессов. Семафоры и мьютексы
Хотелось бы обсудить и уточнить некоторые понятия: 1. Корректно ли следующее утверждение....

Семафоры в Linux
Уважаемые форумчане! Подскажите пожалуйста, где ошибка в программе. Нужно чтобы могло быть...

Семафоры в linux
Здравствуйте, помогите пожалуйста реализовать программу копирующая файл произвольного размера...

Какой есть linux софт для синхронизации по ftp?
Хай Олл! Долго выбирал раздел куда написать, решил что веб-мастера должны знать и подался сюда....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru