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

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

05.12.2012, 23:00. Показов 4562. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru