-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328

Параллельный запуск процессов с помощью fork(). Проверить код

08.01.2014, 20:03. Показов 13357. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Правильно ли я накидал параллельный запуск (в данном случае 10 ) процессов с помощью fork() ?
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
    if(pipe(filedes) == -1) 
    {
        perror("pipe failed");
        exit(EXIT_FAILURE);
    }
    
    for(int i = 0; i < 10; i++)
    {
     pid[i] = fork();
      if (pid[i] != 0)
      {
            // parent
 
           const int bufsize = 512;
           char buf[bufsize];
           bzero(buf, bufsize);
 
           read(filedes[0], buf, bufsize);
 
           printf("Parent:\n");
           printf("%s\n", buf);
          }
      else
      {
           // child
           dup2(filedes[1], STDOUT_FILENO);
           execlp("ls", "ls","-l", NULL); //здесь в дальнейшем будут разные процессы
      }
 
    }
   int status;
   wait(&status);//ожидаю завершение всех процессов
есть сомнения, т.к. на одном из сайтов видел вот такой код для 8ми:
C++
1
2
3
fork();
fork();
fork();
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.01.2014, 20:03
Ответы с готовыми решениями:

Создание новых процессов, запуск внешних программ fork(), system
Задача запустить внешнее приложение и получить его ID, для того чтобы в дальнейшем отследить живо оно или нет. Почему-то получаю _всегда_...

Fork создание процессов
Скажите, я правильно написал программку, создающую процессы? /*UTS*/ #include &lt;unistd.h&gt; #include &lt;sys/types.h&gt; #include...

Fork() и контроль порождённых процессов
Прошу сильно не писать, с сями дружу лишь на уровне алгоритмизации В общем есть следующее задание: Функциональные требования к...

18
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
08.01.2014, 20:14
Где в твоем коде запуск потоков?...
0
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
08.01.2014, 20:15  [ТС]
Цитата Сообщение от DiffEreD Посмотреть сообщение
Где в твоем коде запуск потоков?...
зачем потоков?? с потоками я уже поработал, мне надо именно процессы. Спасибо
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
08.01.2014, 20:19
Есть несколько моментов, которые смущают.
1. wait ждет изменения статуса одного из дочерних процессов. Следовательно, дождаться всех так просто не выйдет. Нужно что-то вроде сохранения pid всех дочерних процессов и вызов функции waitpid для каждого из них.
2. Проблема - все процессы параллельно пытаются писать в один и тот же канал. При чтении у родительского процесса в результате может получиться каша. Мб имеет смысл создать канал для каждого процесса, а затем мультиплексировать (см select).

Ну и мб стоит озвучить задачу - возможно, она решается чем-нибудь полегче запуска кучи тяжелых процессов.
0
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
08.01.2014, 20:24  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Есть несколько моментов, которые смущают.
1. wait ждет изменения статуса одного из дочерних процессов. Следовательно, дождаться всех так просто не выйдет. Нужно что-то вроде сохранения pid всех дочерних процессов и вызов функции waitpid для каждого из них.
2. Проблема - все процессы параллельно пытаются писать в один и тот же канал. При чтении у родительского процесса в результате может получиться каша. Мб имеет смысл создать канал для каждого процесса, а затем мультиплексировать (см select).

Ну и мб стоит озвучить задачу - возможно, она решается чем-нибудь полегче запуска кучи тяжелых процессов.
да задача такая: запустить десяток процессов именно параллельно, потом дождаться завершения всех процессов(в данном случае ls, а по заданию разные названия их считываются из файла - это я сделал) при это через pipe родительский процесс (который ожидает завершения всех) должен получить информацию из потока вывода процесса и потока ошибок (в том порядке в котором они будут завершаться т.е. порядок каждый раз разный).
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
08.01.2014, 20:27
Ну можно в принципе повесить обработчик на SIGCHILD и там уже определять какой процесс завершился, и только в этом случае читать из соответствующего ему канала, если требуется сохранить порядок...
1
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
09.01.2014, 14:14  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Ну можно в принципе повесить обработчик на SIGCHILD и там уже определять какой процесс завершился, и только в этом случае читать из соответствующего ему канала, если требуется сохранить порядок...
дак всё же, если запускать процессы таким образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
pid_t pid[10];
pid[0] = fork();
if(pid[0] == 0)
{}
else {}
pid[1] = fork();
if(pid[1] == 0)
{}
else {}
pid[2] = fork();
if(pid[2] == 0)
{}
else {}
они будут работать "параллельно" или нет?
и второе, имеется вот такая привязка:
C++
1
2
 signal (SIGCHLD, sig_chld); //привязка конкректного 
//сигнала к функция обработки сигнала
вот функция обработки сигнала
C++
1
2
3
4
5
6
7
void sig_chld(int signo){
    pid_t pid;
    int stat;
    while( ( pid = waitpid(-1, &stat, WNOHANG) ) > 0 ){
 
    }
}
что надо подавать в качестве параметра(int signo) в функцию? и правильно ли написан обработчик? можно ли уже после while получать данные с дочернего процесса через pipe? Заранее спасибо
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
09.01.2014, 15:57
Цитата Сообщение от танкист34 Посмотреть сообщение
дак всё же, если запускать процессы таким образом:
Будут выполняться параллельно, только не нужно полностью писать такую портянку - т.е. достаточно все записать в один цикл, как и было предложено изначально.

Цитата Сообщение от танкист34 Посмотреть сообщение
что надо подавать в качестве параметра(int signo) в функцию?
В обработчик сигнала самому ничего передвать не нужно. Когда он будет вызван, в качестве аргумента будет передано значение пойманного сигнала. Может быть использовано, например если один обработчик назначается нескольким сигналам.

Цитата Сообщение от танкист34 Посмотреть сообщение
и правильно ли написан обработчик?
Вроде ничего криминального не вижу. Т.е. определим pid всех процессов, состояние которых изменилось, и уже в самом теле цикла можно будет получать данные.

Теперь важное: опровергаю свои же слова. Я не уверен насколько корректно читать из канала только в конце. Т.е. между записью и чтением данные должны храниться в каком-то буфере, не думаю, что он резиновый.

Если вечером буду не слишком упоротый, попробую набросать пример.

Добавлено через 11 минут
Собственно, размер буфера канала:
Bash
1
2
3
4
$ ulimit -a
...
pipe size            (512 bytes, -p) 8
...
Добавлено через 2 минуты
Ну как я понимаю, это обычная лаба, поэтому можно не заморачиваться, пусть просто работает как задумывалось изначально.
0
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
09.01.2014, 16:11  [ТС]
0x10, спасибо большое=)) может быть и стоит считывать данные в цикле while? получается обнаруживается завершившийся потомок->он что-то записал в pipe, а когда в while вызовешь функцию на чтение из пайпа, то писать следующий потомок уже не сможет туда->пока родитель не считает, дочерние блокируются.
Я просто уже как-то раз применял read и write и действительно они инхронизируют чтение-запись.
Просто вот я не знаю для всех ли дочерних процессов будет один только родитель, по мне вроде как да, тогда способ должен сработать.
Но проблема возникает ещё в том, что при запуске данных из потока ошибок процесса программа не завершается, а как бы уходит в бесконечный цикл. И есть сомнения по поводу того, всегда ли в поток ошибок что-то пишется, если процесс завершился нормально или нет.

Добавлено через 1 минуту
Цитата Сообщение от 0x10 Посмотреть сообщение
Ну как я понимаю, это обычная лаба, поэтому можно не заморачиваться, пусть просто работает как задумывалось изначально.
нет, это не лаба, это задание на защиту лабы(дополнительный вопрос)

Добавлено через 3 минуты
Цитата Сообщение от 0x10 Посмотреть сообщение
pipe size (512 bytes, -p) 8
а что это даёт? размер pipe не больше 512 или 512*8?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
09.01.2014, 16:13
Цитата Сообщение от танкист34 Посмотреть сообщение
получается обнаруживается завершившийся потомок->он что-то записал в pipe, а когда в while вызовешь функцию на чтение из пайпа, то писать следующий потомок уже не сможет туда->пока родитель не считает, дочерние блокируются.
Ограничиваться одним каналом для всех процессов не стоит.
Может получиться ситуация, когда сначала один процесс записал порцию данных, потом второй что-то записал туда же. Как при чтении из канала разделять?

Добавлено через 2 минуты
Цитата Сообщение от танкист34 Посмотреть сообщение
а что это даёт? размер pipe не больше 512 или 512*8?
Стандартный лимит на буфер канала - 4096 байт. Его можно увеличить, но на это может не быть прав.

Предлагаю не заморачиваться. Тем более если это всего лишь доп. задание.
0
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
09.01.2014, 16:16  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Может получиться ситуация, когда сначала один процесс записал порцию данных, потом второй что-то записал туда же. Как при чтении из канала разделять?
ну просто если он записал, значит, он завершился я так понимаю, следовательно, считываем read ом, а когда read работает по идее писать в pipe никто не должен

Добавлено через 1 минуту
Цитата Сообщение от 0x10 Посмотреть сообщение
Предлагаю не заморачиваться. Тем более если это всего лишь доп. задание.
не заморачиваться это как? создать pipe на 4096 и писать туда? а потом по окончании всех предков считать?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
09.01.2014, 17:49
Цитата Сообщение от танкист34 Посмотреть сообщение
ну просто если он записал, значит, он завершился
Процесс может писать много, и запись производится не один раз в конце, а по ходу выполнения.

Цитата Сообщение от танкист34 Посмотреть сообщение
не заморачиваться это как?
Как и было сказано в начале: по одному каналу на каждый дочений процесс (грубо говоря), считывать только после завершения процесса.
1
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
09.01.2014, 18:14  [ТС]
я вот так вот считываю с файла имена процессов, а потом делаю указатели типа char, чтобы использовать их при вызове, например, ls через execlp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  //получение имён процессов из файла
    std::ifstream file("proc_name.txt");
    std::string str[10];
    int k = 0;
    while(file) {
      std::getline(file, str[k]);
      k++;
    }
    //получен массив с названиями процессов из файла
    //перевод названий процессов в массив char
    char mass[10][10];
    for(int i = 0; i < 10; i++)
    {
        strcpy(mass[i], str[i].c_str() ); 
    }
    char *p[10]; //массив указателей на строки
    for(int i = 0; i < 10; i++)
    {
        p[i] = mass[i];
    }
но когда подсовываешь указатель вот так:
C++
1
execl(p[0], p[0], NULL);
процесс не запускается, я думаю что что-то с путём не то, так как если исправить на
C++
1
execl(/bin/ls, p[0], NULL);
, то всё работает, как быть? ведь я изначально не знаю какой процесс (название его) будет на первом месте в файле
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
09.01.2014, 18:24
1. Как выглядит содержимое файла?
2. Я понимаю, что тут раздел плюсовый, но насколько я знаю, линуксовые лабы зачастую пишутся на чистых сях. У вас нет такого условия?

Добавлено через 49 секунд
3. Можно проверять возвращаемое значение exec и выводить сообщение об ошибке - будет понятно без телепатов.

Добавлено через 6 минут
4. Чтение сначала в string, потом копирование в массив... Нет, это определенно слишком мутно.
0
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
09.01.2014, 18:44  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
но насколько я знаю, линуксовые лабы зачастую пишутся на чистых сях. У вас нет такого условия?
нет, ограничения нет, g++ стоит
файл вот такого вида
ls
date
arch
.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
09.01.2014, 18:49
Ну как бы вот. execl не ищет исполняемые файлы в PATH, а требует полных путей. См функции, где в названии есть буква p - execlp, execvp.
0
-23 / 0 / 2
Регистрация: 15.03.2013
Сообщений: 328
09.01.2014, 19:05  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Ну как бы вот. execl не ищет исполняемые файлы в PATH, а требует полных путей. См функции, где в названии есть буква p - execlp, execvp.
я их тоже пробывал, такая же петрушка, не запускаются и всё если на первом месте указатель=))
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
09.01.2014, 19:09
Еще раз: посмотри сообщение об ошибке. man perror
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
09.01.2014, 20:03
Понятно, что этот этап уже пройден, но все-таки приложу упрощенный пример того, что требуется в исходном задании. Весь прочий обвес в виде перенаправления stderr, чтения списка процессов из файла и т д - по желанию, самостоятельно.

В примере запускаются процессы, каждый из которых спит i секунд.
Вложения
Тип файла: zip run10.zip (2.0 Кб, 47 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.01.2014, 20:03
Помогаю со студенческими работами здесь

Генерация древа процессов используя fork
Битый час уже пытаюсь создать древо процессов по заданному образцу (0 1 1 2 2 5 6). То есть первый процесс не имеет родителя среди ваших...

Создание процессов, системный вызов fork()
Доброго времени суток, просьба разъяснить такой вопрос, написал такой код #include &lt;stdlib.h&gt; #include &lt;sys/types.h&gt; ...

Очередность выполнения процессов после fork()
Подскажите, что будет выводиться в консоль если поле вызова fork() внутри обоих процессов будет выполняться бесконечный цикл выводящий...

Функция fork() - определить, сколько процессов будет порождено
Здравствуйте! Чувствую, что не в тот раздел пишу, но тем не менее, возник вопрос: если порождать новый процесс таким образом, то получится...

Debian Linux - Создание процессов (дед, отец, сын), fork();
Привет всем. Появилось у меня несколько вопросов по созданию процессов. Может будете ругаться, но реально не могу понять.. Уже гугл...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

Новые блоги и статьи
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru