Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ под Linux
Войти
Регистрация
Восстановить пароль
 
ibs98
0 / 0 / 0
Регистрация: 23.12.2015
Сообщений: 13
1

Чуть поменять

16.05.2018, 19:15. Просмотров 161. Ответов 1
Метки нет (Все метки)

Кликните здесь для просмотра всего текста
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
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdlib.h>
 
#define SHM_SIZE 2 * sizeof(int)
 
/*
Вариант № 2(а)
Процесс 1 порождает потомков 2 и 3. Все процессы записывают в общую разделяемую память число, равное своему номеру.
Используя семафоры, обеспечить следующее содержимое области памяти: 123123123.
Последний процесс считывает содержимое разделяемой памяти, выводит его на экран и удаляет разделяемую память.
*/
 
struct sembuf sb;
short array[3];
int p(int sid, int NumS);
int v(int sid, int NumS);
 
// Операция уменьшает значение аргумента на 1, если результат не становится отрицательным
int p(int sid, int NumS)
{
    sb.sem_num = NumS;
    sb.sem_op = -1;
    semop(sid, &sb, 1);
}
 
// Операция увеличивает значение аргумента на 1
int v(int sid, int NumS)
{
    sb.sem_num = NumS;
    sb.sem_op = 1;
    semop(sid, &sb, 1);
}
 
void main()
{
    int pid1, pid2, pid3;
    int shmid, *pint, semid, i;
    char *addr;
 
    // shmget - создание области разделяемой памяти, где:
    // shmid - идентификатор области разделяемой памяти, соответсвующий значению аргумента key
    // IPC_PRIVATE (key) - позволяет создать новый разделяемый сегмент памяти с заданным размером SHM_SIZE
    // 0777 - параметры создания и права доступа (полные права)
    shmid = shmget(IPC_PRIVATE, SHM_SIZE, 0777);
 
    // shmat - присоединяет область разделяемой памяти к виртуальному адресному пространству процесса
    // NULL - виртуальный адрес, по которому хотим подключить область (система выбирает сама подходящий)
    // 0 - параметр доступа к области памяти
    addr = shmat(shmid, NULL, 0);
    pint = (int *)addr;
    
    // semget - создание набора семафоров и получение доступа к ним
    semid = semget(IPC_PRIVATE, 3, 0777);
 
    // Инициализация семафоров (0 открыт; 1, 2 закрыты)
    array[0] = 1;
    array[1] = 0;
    array[2] = 0;
 
    // semctl - выполнение управляющих операций над набором семафоров
    // 3 - количество семафоров
    // SETALL - установка значений всех семафоров в соответствии с содержимым array
    semctl(semid, 3, SETALL, array);
 
    pid2 = fork();
    if (pid2 != 0)
    {
        pid3 = fork();
    }
    if (pid2 != 0 && pid3 != 0) // Для первого процесса
    {
        for (i = 0; i < 3; i++)
        {
            // Закрыть 0 семафор
            p(semid, 0);
            // Записать в масисив цифру 1
            *pint = 1;
            // Открыть 1 семафор
            v(semid, 1);
            pint = pint + 3;
        }
    }
    if (pid2 == 0) // Для второго процесса
    {
        pint = (int *)addr + 1;
        for (i = 0; i < 3; i++)
        {
            // Закрыть 1 семафор
            p(semid, 1);
            // Записать в масисив цифру 2
            *pint = 2;
            // Открыть 2 семафор
            v(semid, 2);
            pint = pint + 3;
        }
    }
    if (pid3 == 0) // Для третьего процесса
    {
        pint = (int *)addr + 2;
        for (i = 0; i < 3; i++)
        {
            // Закрыть 2 семафор
            p(semid, 2);
            // Записать в масисив цифру 3
            *pint = 3;
            // Открыть 0 семафор
            v(semid, 0);
            pint = pint + 3;
        }
        // Вывод на экран
        pint = (int *)addr;
        for (i = 0; i < 9; i++)
        {
            printf("%d", pint[i]);
        }
        // Удалить область разделяемой памяти
        shmctl(shmid, IPC_RMID, 0);
    }
    exit(0);
}


Привет всем, на данный момент выводит 123123123.
Нужно, чтобы выводило в порядке 312312312.
Может кто код поменять?) Как вызвать сначала 3 процесс?
Но в задании требуется, чтобы номер процесса соответствовал выводимому числу.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2018, 19:15
Ответы с готовыми решениями:

файл вещественных чисел, нужно поравить код совсем чуть-чуть
Вот написал, но работает только для целых чисел.Как сделать для файла с...

Когда я соединяю комп и телевизор через Tv-Out, кабель чуть чуть искрит.
Всем привет. Есть такой вопрос. Когда я соединяю комп и телевизор через Tv-Out,...

Отнять последнюю строку от остальных (чуть-чуть исправить код)
Надо последнею строку матрицы отнять от всех остальных, у меня это получилось...

Некорректно работает ListListener и еще чуть-чуть всякого стаффа
Всем привет! Я постигаю вощем java потихоньку... вот у меня возникло пара...

Много текста на одной странице или по чуть-чуть на нескольких?
В процессе оформления перечня и описания услуг на сайте компании я озадачился...

1
Dovgon
148 / 118 / 50
Регистрация: 08.04.2010
Сообщений: 711
18.05.2018, 04:56 2
Используй мьютекс для блокировки 1 и 2 пока не выполнится 3.
C++
1
2
3
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2018, 04:56

Немогу разобраться в программе нужно пожалуйста чуть чуть дописать её!
Уже вроде все написал.И должно работать!! Но не хочет рисовать незнаю почему,...

Вопрос с массивом !!) я сам сделал..чуть чуть подправить надо...а как не знаю?!!((((
ВОТ УСЛОВИЕ МОЕЙ ЗАДАЧИ!!! &quot;&quot;&quot;В бюро по ремонту квартир поступили сведения о...

Зависает, подскажите что исправить пожалуйста, и доработать чуть чуть, очень надо
Разработать программу , которая в диалоговом режиме позволяет а ) создать файл...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru