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

Синхронизация процессов

05.12.2012, 23:00. Показов 4603. Ответов 11

Студворк — интернет-сервис помощи студентам
Здравствуйте!Подскажите пожалуйста как выполнить следующее задание:
Программа порождает иерархическое дерево процессов. Каждый процесс выводит сообщение о начале выполнения, создает пару процессов, сообщает об этом, ждет завершения порожденных процессов и затем заканчивает работу. Поскольку действия в рамках каждого процесса однотипны, эти действия должны быть оформлены отдельной программой, загружаемой системным вызовом exec().
Параметр программы - число уровней (не более 5).
Р01(0 уровень)->Порождает Р11 и Р12(1 уровень)->Каждый из них в свою очередь порождает Р21 и Р22; Р23 и Р24(2 уровень) и т.д.

Спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.12.2012, 23:00
Ответы с готовыми решениями:

Синхронизация процессов
Здравствуйте , помогите с синхронизацией процессов. Нужно создать 2 процесса дочерних и читать файл по 10 символов в течении 10 секунд либо...

Синхронизация процессов
Добрый вечер, форумчане! Имеется такая задача: Исходный процесс создает два программных информационных канала К1 и К2, канал...

Синхронизация процессов в linux
Имеется следующий код, который по нажатию на клавишу "+" добавляет процесс, а по нажатию клавиши "-" удаляет процесс. Процессы...

11
51 / 49 / 7
Регистрация: 31.10.2011
Сообщений: 98
06.12.2012, 19:31
man fork
man wait
man exec
0
0 / 0 / 0
Регистрация: 03.04.2010
Сообщений: 83
08.12.2012, 19:17  [ТС]
Подскажите пожлста,как создавать два дочерних процесса одновременно?
pid0=getpid();
printf("Process P01,pid_P01=%d:\n",pid0);
pid1=fork();
if (pid1==0)
printf("Process P11,pid_P11=%d:\n",pid1);
pid2=fork();
if (pid2==0)
printf("Process P12,pid_P12=%d:\n",pid2);

Так не получается...

Добавлено через 1 минуту
И + ко всему они должны быть на одном иерархическом уровне
0
51 / 49 / 7
Регистрация: 31.10.2011
Сообщений: 98
08.12.2012, 19:57
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
#include <stdio.h>
#include <stdlib.h>
 
#include <errno.h>
 
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
 
#define PROCESSES 2
 
int main(void) {
    int i;
    int status;
    int isParent = 1;
    pid_t pids[PROCESSES];
 
    printf("Process P01, pid = %d\n", (int)getpid());
    for (i = 0; i < PROCESSES; ++i) {
        pids[i] = fork();
 
        if (pids[i] == -1) {
            fprintf(stderr, "error while fork: %s\n", strerror(errno));
            exit(EXIT_FAILURE);
        } else if (pids[i] == 0) {
            /* child */
            printf("Process P1%d, pid = %d\n", i, (int)getpid());
            isParent = 0;
            break;
            /* if not break, child is about to start processes in this cycle */
        }
    }
 
    if (isParent) {
        for (i = 0; i < PROCESSES; ++i) {
            if (waitpid(pids[i], &status, 0) == -1) {
                fprintf(stderr, "error waiting for child %d: %s\n", i, strerror(errno));
            }
 
            if (WIFEXITED(status)) {
                printf("Process P1%d pid %d exited\n", i, (int)pids[i]);
            } else if (WIFSIGNALED(status)) {
                printf("Process P1%d pid %d was terminated by a signal\n", i, (int)pids[i]);
            } else {
                printf("Wait for process P1%d pid %d succeed.\n", i, (int)pids[i]);
            }
        }
    }
 
    exit(EXIT_SUCCESS);
}
"Одновременно" нельзя, можно только последовательно. Не забывайте, что после того, как вы сказали fork(), два процесса начинают выполнять один и тот же код, так что удостоверьтесь, что ни дочерний, ни родительский процесс не выполнят неположенный им код.
1
0 / 0 / 0
Регистрация: 03.04.2010
Сообщений: 83
08.12.2012, 20:23  [ТС]
Изменила вместо #define PROCESSES 2,что пользователь сам вводил кол-во процессов,а при выполнении(не при компилировании)пишет ошибка сегментирования
0
51 / 49 / 7
Регистрация: 31.10.2011
Сообщений: 98
08.12.2012, 21:07
Цитата Сообщение от Define Посмотреть сообщение
Изменила вместо #define PROCESSES 2,что пользователь сам вводил кол-во процессов,а при выполнении(не при компилировании)пишет ошибка сегментирования
Скорее всего, выход за пределы границы массива. Запустите из-под gdb и посмотрите backtrace.
Bash
1
2
3
gdb ./progname
(gdb) r
(gdb) bt
0
0 / 0 / 0
Регистрация: 03.04.2010
Сообщений: 83
08.12.2012, 22:32  [ТС]
Пишет ту же самую ошибку..

Добавлено через 41 минуту
В программе нужно задавать № иерархического уровня,а не количество процессов.
0
51 / 49 / 7
Регистрация: 31.10.2011
Сообщений: 98
09.12.2012, 00:40
Цитата Сообщение от Define Посмотреть сообщение
Пишет ту же самую ошибку..
Если вы ничего не меняли, ошибка вряд ли бы поменялась. gdb нужен, чтобы понять, в каком месте программы возникает ошибка сегментирования.

Цитата Сообщение от Define Посмотреть сообщение
В программе нужно задавать № иерархического уровня,а не количество процессов.
Я не решал вашу задачу, я помогал с
Цитата Сообщение от Define Посмотреть сообщение
Подскажите пожлста,как создавать два дочерних процесса одновременно?
0
0 / 0 / 0
Регистрация: 03.04.2010
Сообщений: 83
11.12.2012, 00:18  [ТС]
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
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void) {
 int level, k, j, x1, x2;
  pid_t pids[5][2];
  //pid_t pid[5], pid1[2];   
int x;
printf("Vvedite kol-vo urovney\n"); 
scanf("%d", &level);
x=2;
if (level==0) 
{printf("Process P01, pid = %d\n", (int)getpid());}
else
{
printf("Process P01, pid = %d\n", (int)getpid());
for (k=1; k<=level; k++)
{ //pid[k]=fork();
/.if (pid[k]!=0) { break;} 
//if (pid[k]==0) printf("Process Plevel%d, pid = %d\n", k, (int)getpid());
//else{
for (j=1; j<=x; j++)
{
 
pids[k][j]= fork();
if (pids[k][j]!=0) { break;} 
if (pids[k][j]==0) printf("Process P%d%d, pid = %d\n",k,  j, (int)getpid());
}
x=x*2;
//}
}
}
exit(0);
}
Помогите пожалуйста доделать.
Добавлено через 50 секунд
Помогите пожалуйста доделать.
0
51 / 49 / 7
Регистрация: 31.10.2011
Сообщений: 98
11.12.2012, 00:53
Цитата Сообщение от Define Посмотреть сообщение
Помогите пожалуйста доделать.
Это нечитаемо, оно не скомпилируется. На вашем месте я бы начал с написания функции, которая может породить несколько процессов (и не забудьте про порядковые номера в иерархии процессов - 01, 11, 12 и т.д.).
0
0 / 0 / 0
Регистрация: 03.04.2010
Сообщений: 83
11.12.2012, 01:04  [ТС]
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
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void) {
 int level, k, j, x1, x2;
  pid_t pids[5][2];
  //pid_t pid[5], pid1[2];   
int x;
printf("Vvedite kol-vo urovney\n"); 
scanf("%d", &level);
x=2;
if (level==0) 
{printf("Process P01, pid = %d\n", (int)getpid());}
else
{
printf("Process P01, pid = %d\n", (int)getpid());
for (k=1; k<=level; k++)
{ 
//pid[k]=fork();
//f (pid[k]!=0) { break;} 
//if (pid[k]==0) printf("Process Plevel%d, pid = %d\n", k, (int)getpid());
//else{
for (j=1; j<=x; j++)
{
 
pids[k][j]= fork();
if (pids[k][j]!=0) { break;} 
if (pids[k][j]==0) printf("Process P%d%d, pid = %d\n",k,  j, (int)getpid());
}
x=x*2;
//}
}
}
exit(0);
}
0
51 / 49 / 7
Регистрация: 31.10.2011
Сообщений: 98
11.12.2012, 01:53
Цитата Сообщение от Define Посмотреть сообщение
Программа порождает иерархическое дерево процессов. Каждый процесс выводит сообщение о начале выполнения, создает пару процессов, сообщает об этом, ждет завершения порожденных процессов и затем заканчивает работу. Поскольку действия в рамках каждого процесса однотипны, эти действия должны быть оформлены отдельной программой, загружаемой системным вызовом exec().
Попробуйте разобраться, как работает exec. Вы можете запустить свою программу, она породит ещё два экземпляра себя же самой, дождётся их завершения. Ваша задача - сделать так, чтобы процесс стал конечным, т.е. при каждом вызове программы высота иерархии должна уменьшаться на 1. При достижении 0 программа не должна делать fork-exec, а сразу выходить.
Как делать два вызова fork и ждать потомков, порождённых этими вызовами, вы уже знаете. Высоту дерева можно передавать в main в виде параметра. В руководстве к exec написано, как это сделать. Циферку из командной строки получить сможете? Перед fork'ами проверяете её значение - если больше 0 - форкаемся, если меньше 0 - выходим.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.12.2012, 01:53
Помогаю со студенческими работами здесь

Синхронизация процессов семафоры
у меня что то не получается за синхронизировать 4 процесса, тоесть я хочу чтобы выводила 1,2,3,4 оно выводит 3,1,2. Помогите пожалуйсто ...

Синхронизация процессов сигналами (надежная модель)
Задача: Начальный процесс является управляющим. Он принимает поток ввода с клавиатуры и контролирует дочерние процессы. По нажатию...

Синхронизация процессов
Добрый день! Прошу помощи в следующем вопросе: Есть некое консольное приложение на C#, которое производит работу с двумя файлами...

СИнхронизация процессов
Всем привет. Имеется несколько вопросов про синхронизацию процессов. - Что вобще такое &quot;синхронизация процессов&quot;?? С потоками...

синхронизация процессов
Здравствуйте. Посоветуйте пожалуйста, где узнать что-либо про методы синхронизации процессов в многопроцессорных системах. И если есть,...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru