Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
47 / 31 / 21
Регистрация: 04.04.2016
Сообщений: 209

Создается только один потомок и не создаются дополнительные при следующем входе в цикл

24.04.2016, 21:07. Показов 1550. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main ()
{
  int i;
 
  for (i = 0; i < 2; i ++) {
    fork();
    printf (".");
  }
  return 0;
}
https://ideone.com/FezbDV

Выполнение данного кода печатает 4 точки. Хотя судя из описания этой системной функции должно быть напечатано..
по моим подсчетам 6.. почему создается только один потомок и не создаются дополнительные при следующем входе в цикл?

Добавлено через 1 час 45 минут
т.е. всего будет порождено 3 процесса (общее кол-во процессов = 4)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.04.2016, 21:07
Ответы с готовыми решениями:

Не создаются новые потоки при распараллеливании цикла for (работает только один поток - главный)
Доброго времени суток, ребята! Пишу код по распараллеливанию умножения матриц. Всё вроде работает верно, но есть один момент OMP не...

Функция: есть ли в бинарном дереве внутренний узел, у которого только один потомок?
Здравствуйте. Помогите пожалуйста. Надо написать функцию,проверяющую есть ли в дереве внутренний узел, у которого только один потомок. ...

Если внутри функции создается объект с помощью gcnew, он создается один раз или при каждом вызове?
Обработчик по нажатию кнопки Visual C++ 2010 private: System::Void but1_Click(System::Object^ sender, System::EventArgs^ e) { ...

7
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
25.04.2016, 19:43
Цитата Сообщение от Pink_Pank Посмотреть сообщение
по моим подсчетам 6
Маладэц! Правильно считаете.
Цитата Сообщение от Pink_Pank Посмотреть сообщение
почему создается только один потомок и не создаются дополнительные при следующем входе в цикл?
Откуда вы это взяли. Исправьте ошибки и будет шесть.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main ()
{
  int i;
 
  for (i = 0; i < 2; i ++) {
    int pd= fork();
    printf (".\n");
    if (pd) wait (0);
  }
  return 0;
}
1
47 / 31 / 21
Регистрация: 04.04.2016
Сообщений: 209
25.04.2016, 19:50  [ТС]
А так вообще 8.
https://ideone.com/SZCVzg

А Вы хотите сказать, что у меня родительский поток завершается раньше дочерних и останавливает их работу?.. Почему он должен их останавливать? Или как это объяснить. и откуда в Вашем примере взялось 8 точек?
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
25.04.2016, 20:04
Цитата Сообщение от Pink_Pank Посмотреть сообщение
А Вы хотите сказать, что у меня родительский поток завершается раньше дочерних и останавливает их работу?
Я ничего не хочу сказать, но такая ситуация обязана быть предусмотренной.
Цитата Сообщение от Pink_Pank Посмотреть сообщение
Почему он должен их останавливать?
Должен, если успеет.
Цитата Сообщение от Pink_Pank Посмотреть сообщение
откуда в Вашем примере взялось 8 точек?
У меня их шесть. Почему восемь на вашем сайте - наверное, потому что printf не является процессо- независимой. Распечатайте пиды и посмотрите.
1
47 / 31 / 21
Регистрация: 04.04.2016
Сообщений: 209
26.04.2016, 12:03  [ТС]
Цитата Сообщение от gng Посмотреть сообщение
Должен, если успеет.
Прошу прощения, что без ссылок. Недавно просмотрел множество ресурсов по этой теме.
Прочитал следующее (своими словами):
если дочерний поток завершается раньше родительского, то он возвращает родительскому результат своего выполнения. и висит в записях запущенных процессов ОС (зомби) до тех пор, пока родитель не обработает этот возврат или пока родитель не завершится.
А если родитель завершается вперед дочернего, то все порожденные им процессы наследуются системным потоком Init (ну, или как-то так он называется, который стартует при запуске ОС и порождает все остальные процессы) с PID = 1. И результат возврата из дочерних процессов обрабатывает уже этот Init.
А вот чтобы завершать дочерние процессы при завершении родительского - так когда такая необходимость появляется, люди (судя по форумам) еще и пытаются извернуться, чтобы эту ситуацию воплотить в реальность. Т.е. по умолчанию в ОС Unix этого не предусмотрено.
Цитата Сообщение от gng Посмотреть сообщение
Почему восемь на вашем сайте - наверное, потому что printf не является процессо- независимой. Распечатайте пиды и посмотрите.
Я могу предположить только, что порожденные процессы (3 процесса) продолжили выполнение не с момента вызова fork(), а с самого начала, что совсем не поддается никакому объяснению. Сейчас попробую скомпилить и запустить под Убунтой на виртуалке.
А по поводу printf, насколько помню, там внутри нее выделяется свой буфер и каждый процесс, который к ней обращается, добавляет в этот буфер символы для печати. а те уже, в свою очередь, печатаются по мере возможности.

Добавлено через 23 минуты
В Убунту также 8 точек и всего 4 процесса (1 родитель и 3 дочи)
Т.е. все они выполняются (по крайней мере цикл выполняется) полностью. Странно.. почему они не продолжают с места вызова fork()..
Немного модифицировал код. Да, выполняется полностью именно с момента начала цикла.. Странно..
Кто-то знает, почему игнорируется текущее значение локальных переменных цикла и тот запускается с начала?
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
26.04.2016, 12:13
Цитата Сообщение от Pink_Pank Посмотреть сообщение
В Убунту также 8 точек и всего 4 процесса (1 родитель и 3 дочи)
Т.е. все они выполняются (по крайней мере цикл выполняется) полностью. Странно.. почему они не продолжают с места вызова fork()..
У меня шесть
Bash
1
2
3
4
5
gg@:~/cc/tmp$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
gg@:~/cc/tmp$ uname -a
Linux 4.2.0-0.bpo.1-amd64 #1 SMP Debian 4.2.6-3~bpo8+2 (2015-12-14) x86_64 GNU/Linux
И должно быть шесть. Проверить просто. Вместо принтфа делайте что-то другое, напр. создавайте отдельный файл.
1
47 / 31 / 21
Регистрация: 04.04.2016
Сообщений: 209
26.04.2016, 13:09  [ТС]
В общем, если так написать:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main ()
{
  int i;
 
  for (i = 0; i < 2; i ++) {
    printf("I am process\n");
    int pd= fork();
    printf (".\n");
    if (pd) wait (0);
  }
  printf("the end\n");
  return 0;
}
то работает нормально.
а если закомментить и запустить вот так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main ()
{
  int i;
 
  for (i = 0; i < 2; i ++) {
    //printf("I am process\n");
    int pd= fork();
    printf (".\n");
    if (pd) wait (0);
  }
  printf("the end\n");
  return 0;
}
то работает через одно место. Видимо, действительно проблема в printf()

А по поводу завершения дочерних процессов при завершении родительского может кто-то ссылок накидать по теме, где бы это подробно разбиралось? Желательно на русском.
Миниатюры
Создается только один потомок и не создаются дополнительные при следующем входе в цикл  
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
26.04.2016, 13:38
Лучший ответ Сообщение было отмечено Pink_Pank как решение

Решение

Цитата Сообщение от Pink_Pank Посмотреть сообщение
по поводу завершения дочерних процессов при завершении родительского
Выше вы верно написали. Дочерние переходят к процессу 1 (init или systemd или ...). Тем не менее, если процесс подключен к тому же терминалу, его необходимо ожидать.
Если завершается лидер сессии, то он завершает всё свое дерево.
В общих чертах можно посмотреть https://www.win.tue.nl/~aeb/linux/lk/lk-10.html
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.04.2016, 13:38
Помогаю со студенческими работами здесь

При нажатии на кнопку файл не создается на диске, а он создается только после сворачивания или закрытия окна...
Знакомлюсь с графическим интерфейсом Java Swing. Появилась такая проблема: при нажатии на кнопку должен создаваться файл на диске, а он...

Команда "Требовать смены пароля при следующем входе в систему"
Нужна команда, которая поставит на локальных пользователей флажок &quot;Требовать смены пароля при следующем входе в систему&quot; В интернете...

Факториал. Использовать только одну функцию main и только один цикл
задача вообщем простая, но условия осложняют: \sum_{i=0}^{n-1} {x}_{i}/i! использовать только одну функцию main и только один...

Ошибка: "Меню "Пуск" не работает. Мы попытаемся восстановить его при вашем следующем входе в систему"
Ни с того, ни с сего, начала возникать ошибка при нажатии на кнопку пуск:Меню &quot;Пуск&quot; не работает. Мы попытаемся восстановить его при...

Ошибка при входе в цикл по компонентам формы
При входе в цикл по компонентам формы сразу вылетает ошибка (при первом же обороте). Кто-нибудь сталкивался с подобным? for i := 0 to...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru