5 / 5 / 2
Регистрация: 12.10.2011
Сообщений: 75
|
||||||
1 | ||||||
Синхронизация процессов сигналами (надежная модель)27.10.2012, 20:31. Показов 3861. Ответов 4
Метки нет (Все метки)
Задача:
Начальный процесс является управляющим. Он принимает поток ввода с клавиатуры и контролирует дочерние процессы. По нажатию клавиши ‘+’ добавляется новый процесс, ‘-’ – удаляется последний добавленный, ‘q’ – программа завершается. Каждый дочерний процесс посимвольно выводит на экран в вечном цикле свою уникальную строку. При этом операция вывода строки должна быть атомарной, т.е. процесс вывода должен быть синхронизирован таким образом, чтобы строки на экране не перемешивались. Мой код:
выводимые строки дочерних процессов при удалении последнего добавленного процесса перемешиваются. Помогите это пофиксить.
0
|
27.10.2012, 20:31 | |
Ответы с готовыми решениями:
4
Синхронизация процессов Синхронизация процессов Синхронизация процессов Синхронизация процессов |
1241 / 960 / 379
Регистрация: 02.09.2012
Сообщений: 2,936
|
|
28.10.2012, 00:54 | 2 |
По теории у вас не хватает механизма синзронизации форкнутых процессов при доступе к общему ресурсу - "вывод на экран". Этот ресурс в каждый момент времени может использовать только один процесс, соответственно нужно что-то типа мьютекса. Поскольку в чистом виде мьютексов нет для процессов (есть для потоков), то можно использовать семафоры. Вам точно нужно для процессов? В потоках как-то проще это реализуется. Для верности я бы еще вызов fflush() добавил после вывода, чтобы удостовериться, что ничего в буферах не осталось.
1
|
5 / 5 / 2
Регистрация: 12.10.2011
Сообщений: 75
|
|
28.10.2012, 16:31 [ТС] | 3 |
Может в потоках и проще, но мне нужно именно процессы синхронизировать, к тому же по заданию мне разрешено использовать только сигналы.
Добавлено через 4 часа 49 минут Я понял в чем была беда. После того как некотрый процесс закончил печатать, он ждет своей очереди. В случае когда я удаляю этот процесс в то время как печатается другой, наш ждущий выходит из цикла while(!fend), потом из внутреннего свитча дочерних процессов, а потом еще наверх. Короче после этого наш процесс начинает творить хаос) Чтобы это устранить достаточно поставить exit(0); или return 0; после цикла while(!fend).
0
|
5 / 5 / 2
Регистрация: 12.10.2011
Сообщений: 75
|
|
30.10.2012, 00:08 [ТС] | 5 |
Я заметил, но все равно спасибо
0
|
30.10.2012, 00:08 | |
30.10.2012, 00:08 | |
Помогаю со студенческими работами здесь
5
Синхронизация процессов синхронизация процессов Синхронизация процессов Синхронизация процессов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |