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

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

05.12.2012, 23:00. Показов 4480. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru