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

Линейная структура дочерних процессов(в linux)

09.01.2013, 23:45. Показов 1862. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include "sys/types.h"
 
using namespace std;
 
int main()
{
    int N = 0;
    cout << "Введите количество процессов ";
    cin >> N;
    if (N < 0) {
        cerr << "Ошибка!!!введите число больше нуля" << endl;
        return 1;
    }
 
    pid_t pid;
 
    for(int i=0;i<N;++i)
    {
        pid = fork();
        switch (pid) {
            case -1:
                cerr << "Процесс не создан" << endl;
                return 1;
                break;
 
            case 0:   
                N--;
                sleep(1);
                break;
 
            default:
                cout << " id созданного процесса =  " << getpid() << " id родительского процесса = " << getppid()<< endl;
                break;
        }
    }
 
    return 0;
}
вот написал код,программа должна создавать линейную структуру дочерних процессов
типа вот так :
процесс->процесс->процесс->процесс->процесс->процесс->процесс->процесс-> и так далее,сколько введу с клавиатуры столько и должна создавать.действием процесса по умолчанию является вывод своего id'а
я вот код написал,но он у меня почему то не работает.кто может подсказать где ошибка???
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2013, 23:45
Ответы с готовыми решениями:

Мониторинг дочерних процессов
У меня есть задача сделать систему процессов, каждый из которых будет заниматься своей задачей....

Запуск дочерних процессов
Здравствуйте, подскажите, пожалуйста: если я хочу запустить три дочерних процесса при помощи...

Создание дочерних процессов
Всем привет, есть рабочая прога, была дана так сказать &quot;на исследование&quot;. Программа создает то...

Вывод pid дочерних процессов
Всем доброго вечера. Проблема следующая:есть процесс, порождающий несколько процессов.Те в свою...

18
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
10.01.2013, 00:32 2
Почему в case 0 вы делаете N--? Нужно же не уменьшить число итераций, а вообще выйти из цикла. Замените на i = N; и будет работать как надо. Хотя я бы ещё добавил wait'ов, дабы первый процесс завершался не раньше остальных.
0
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 9
10.01.2013, 01:08  [ТС] 3
проблема в том,что у меня одна из моих версий этой программы работала даже на android'овском компиляторе!!!
а в kdevelope нет...и проблема программы в том,что выводов на экран то три...только все три одинаковые!!!кароче получается что как будьто бы она всего один процесс дочерний создает и некакой структурой тут и не пахнет...

Добавлено через 12 минут
я бы прикрепил фотку,но что то найти не могу как это сделать...

Добавлено через 5 минут
Введите количество процессов 3
id созданного процесса = 6824 id родительского процесса = 6822
id созданного процесса = 6824 id родительского процесса = 6822
id созданного процесса = 6824 id родительского процесса = 6822
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
10.01.2013, 01:22 4
C++
1
2
3
4
5
6
7
8
            case 0:
                cout << " id созданного процесса =  " << getpid() << " id родительского процесса = " << getppid()<< endl;
                return 0;;
 
            default:
                cout << "Child created" << endl;
                sleep(1);
                break;
Добавлено через 2 минуты
Цитата Сообщение от alexe1ka Посмотреть сообщение
только все три одинаковые!!!
Потому что ты вызываешь
Цитата Сообщение от alexe1ka Посмотреть сообщение
getpid()
В родителе. А он у тебя один и тот же.
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
10.01.2013, 01:22 5
Это сообщения от первого процесса, которому fork() трижды возвращает пид потомка. Судя по всему вы запутались в условиях, это дочерний процесс получает ноль. Что, впрочем, не отменяет моего предыдущего сообщения.
1
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 9
10.01.2013, 01:30  [ТС] 6
то что выше создает маленько другую структуру.там у одного родителя много потомков.типа 1 отец и 6 сыновей.
а мне нужно другое-чтобы у отца был сын,у сына был сын,у сына сына был сын и так далее DD
ПРОЦЕСС->ПРОЦЕСС->ПРОЦЕСС->ПРОЦЕСС->ПРОЦЕСС-> вот так.

Добавлено через 1 минуту
так а можно мне как нибудь сделать чтобы каждый следующий был потомком предыдущего???
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
10.01.2013, 01:38 7
C++
1
2
3
4
5
6
            case 0:
                cout << getppid() << " -> " << getpid() <<endl;
                break;
 
            default:
                return 0;
Введите количество процессов 4
5325 -> 5326
5326 -> 5327
5327 -> 5328
5328 -> 5329
0
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 9
10.01.2013, 01:50  [ТС] 8
я ввожу число и ниче не происходит(((
почему такое может быть???
P.S:сижу под виртуалкой
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
10.01.2013, 01:53 9
Цитата Сообщение от alexe1ka Посмотреть сообщение
почему такое может быть???
Разберись сам.
0
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 9
10.01.2013, 02:06  [ТС] 10
блин...у меня половину версий вот так же :число вводишь-и ничего не происходит...я этот код с перерывами уж месяца полтора пишу...и притом какая то версия даже на телефоне на АНДРОИДОСКОМ компиляторе работала...я гуглил,но полезного так ничего и не нашел(((
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
10.01.2013, 02:08 11
Цитата Сообщение от alexe1ka Посмотреть сообщение
я этот код с перерывами уж месяца полтора пишу.
Ужас. Если у тебя такой тупик на полтора месяца, че те мешает уже давно взять gdb да отдебажить? И гуглить тут нечего на пустом месте, фигней страдаешь.
1
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 9
10.01.2013, 02:15  [ТС] 12
ну я ж не только это пишу,других дел по учебе много...это обычная лаба по сути...но препод хрен че подскажет,и сказал отладку типа даже не пытайтесь делать,потому что программы с процессами типа отлаживать плохо потому что они чего то там только с первым процессом работают...
вот поэтому и немогу...я вот думаю блин может она просто в моем kdevelope не работает...

Добавлено через 2 минуты
ура,сделал!!!!!!!

Добавлено через 18 секунд
всем кто помогал большое спасибо!!!!
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
10.01.2013, 02:18 13
Цитата Сообщение от alexe1ka Посмотреть сообщение
что они чего то там только с первым процессом работают...
препод у вас жжот. Ткни его носом, например, сюда: http://sourceware.org/gdb/onli... Forks.html
Форки прекрасно фоловятся gdb.
Цитата Сообщение от alexe1ka Посмотреть сообщение
.я вот думаю блин может она просто в моем kdevelope не работает...
Ну ты чудик Запусти из консоли, че ты извращаешься в своем кдевелоп...

Добавлено через 1 минуту
Цитата Сообщение от alexe1ka Посмотреть сообщение
ура,сделал!!!!!!!
Молодец. Напиши сюда, че там было. Глядишь, кто-нибудь с твоей проблемой заглянет - пригодится.
1
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 9
10.01.2013, 02:26  [ТС] 14
там sleep надо добавить было.
всем еще раз огромное спасибо.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
10.01.2013, 02:31 15
Цитата Сообщение от alexe1ka Посмотреть сообщение
там sleep надо добавить было.
Не нужен там никакой sleep. Он вообще никакой роли не играет.
0
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 9
10.01.2013, 02:33  [ТС] 16
а у меня без него не работает почему то!!!
но программа то как раз заработала...
и с чем это может быть связано???
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
10.01.2013, 02:37 17
Цитата Сообщение от alexe1ka Посмотреть сообщение
а у меня без него не работает почему то!!!
sleep тут не при чем.
Цитата Сообщение от alexe1ka Посмотреть сообщение
но программа то как раз заработала...
То, что ты пониятия не имеешь, почему она "вдруг" заработала, не значит, что дело в добавленном sleep.
Цитата Сообщение от alexe1ka Посмотреть сообщение
и с чем это может быть связано???
Запусти приложение, как все нормальные белые люди делают - из консоли, безо всяких слипов.
Твой код сокращается до такого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <unistd.h>
 
int main()
{
    int N = 0, i=0;
    std::cout << "Введите количество процессов ";
    std::cin >> N;
 
    while(i++<N)
        if(fork() == 0)
            std::cout << getppid() << " -> " << getpid() <<std::endl;
        else break;
}
И тут нет места, где бы нужен был sleep для работы приложения.
0
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 9
10.01.2013, 02:45  [ТС] 18
спасибо,завтра попробую.я видать "ненормальный людь"
я кстати тоже из нижнего
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
10.01.2013, 02:58 19
Цитата Сообщение от alexe1ka Посмотреть сообщение
я видать "ненормальный людь"
Нормальным людям не нужен kdevelop, чтобы набросать 15 строк кода и их проверить. И, тем более, чтобы проверить. Эту программу можно написать и затестить пока твоя среда еще только запускаться и создавать проект будет. И, конечно, ужасно тяжело скомпилять проект в IDE, а запустить бинарник из консоли. Неимоверно. Не говоря о том, что пользователи твою программу и будут запускать именно из консоли, а kdevelop'а у них даже стоять не будет, они не программисты, им он на фиг не сдался. А ты тестишь ее через хрен пойми что и хрен пойми как. И потом делаешь в программе изменения, которые даже сам не понимаешь. Это вообще нонсенс - программист пишет код и не понимает, нафига и что он пишет.
Цитата Сообщение от alexe1ka Посмотреть сообщение
я кстати тоже из нижнего
Круто
0
10.01.2013, 02:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2013, 02:58
Помогаю со студенческими работами здесь

Создание двух дочерних процессов
Я всю программу сделал, но создал только 1 дочерний. Как сделать их 2 и более? Уже 3-й час не могу...

Создание дочерних процессов. Пайпы
Здравствуйте, подскажите, пожалуйста, что не так. Есть программа, сортирующая файл: sort.cpp...

Процесс порождает 7 дочерних процессов-потомков
Процесс порождает 7 дочерних процессов-потомков. Процессы выводят сообщение о старте, выполняют...

Завершение процесса и его дочерних процессов
Доброе время суток! Подскажите, пожалуйста, как можно реализовать завершение процесса (зная его...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru