4 / 4 / 2
Регистрация: 13.11.2012
Сообщений: 253

Создание процессов, системный вызов fork()

30.01.2016, 16:05. Показов 5999. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, просьба разъяснить такой вопрос, написал такой код
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
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
 
 
int main()
{
pid_t pid;
 
switch(pid=fork())
{
case -1:
    {
    printf("Ошибка создания процесса\n");
    exit(1);//выход из родительского процесса
    }
case 0:
    {//код потомка    
    printf("Процесс-потомок: PID= %d\n",getpid());
    printf("Родительский процесс: PID= %d\n ",getppid());
 
    }
default:
    {//код родителя
    printf("Родительский процесс %d\n ",getpid());
    printf("Потомок процесса %d\n ",pid);
 
    }
}
return (0);
}
при запуске программы получаю такой результат
konsul777@ubuntu-VirtualBox:~/Project/drevo$ ./proga1
Родительский процесс 2821
Потомок процесса 2822
konsul777@ubuntu-VirtualBox:~/Project/drevo$ Процесс-потомок: PID= 2822
Родительский процесс: PID= 807
Родительский процесс 2822
Потомок процесса 0

konsul777@ubuntu-VirtualBox:~/Project/drevo$
почему в том месте программы, где код процесса-потомка, отображается не родителя, в моем случае 2821, а 807?

Добавлено через 39 минут
правильно ли я понимаю - у порожденного процесса идентификатор родительского процесса должен совпадать с идентификатора родительского процесса, от которого он порожден?
Даже запускаю эту программу из учебника, выходят разные идентификаторы PID родителя и PPID потомка
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
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
 
int main()
{
 
pid_t pid, ppid, chpid;
int a = 0; 
 
chpid = fork();
 
/* При успешном создании нового процесса с этого места псевдопараллельно начинают работать 2 процесса: старый и новый */
 
/* Перед выполнением следующего выражения a в обоих процессах равно 0 */
 
a = a+1; 
 
/* Узнаем идентификаторы текущего и родительского процесса (в каждом из процессов !!!) */
 
pid = getpid();
ppid = getppid();
 
/* Печатаем значения PID, PPID и вычисленное значение a (в каждом из процессов !!!) */
 
printf("My pid = %d, my ppid = %d, result = %d\n", (int)pid, (int)ppid, a); 
 
return 0;
 
}
Добавлено через 1 час 12 минут
такое поведение может быть связано с тем, что linux на виртуалке установлен?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.01.2016, 16:05
Ответы с готовыми решениями:

Распараллелить задачу, ипользуя при системный вызов fork (), и трубу pipe
Дали задание распараллелить какую то задачу, ипользуя при этом системный вызов fork(), и трубу pipe. К примеру, что б потомке считалась...

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

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

5
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
30.01.2016, 20:31
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

konsul777, добавил несколько строк в вашу программу
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
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
 
 
int main()
{
pid_t pid;
 
switch(pid=fork())
{
case -1:
    {
    printf("Ошибка создания процесса\n");
    exit(1);//выход из родительского процесса
    }
case 0:
    {//код потомка  
    printf("Процесс-потомок: PID= %d\n",getpid());
    printf("Родительский процесс: PID= %d\n ",getppid());
    break;
    }
default:
    {//код родителя
    printf("Родительский процесс %d\n ",getpid());
    printf("Потомок процесса %d\n ",pid);
    wait (NULL);
    break;
    }
}
0
4 / 4 / 2
Регистрация: 13.11.2012
Сообщений: 253
30.01.2016, 21:05  [ТС]
gng, я wait тоже когда добавлял, тоже работало, но вот как отрабатывает этот код в этом примере и почему он не работает у меня когда компилирую? родительский процесс завершается раньше, чем дочерний выходит и дочерний уже не "помнит" родительский?
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
30.01.2016, 21:14
Цитата Сообщение от konsul777 Посмотреть сообщение
родительский процесс завершается раньше, чем дочерний выходит и дочерний уже не "помнит" родительский?
Мы помним родителей после их смерти. У процессов по-другому :-(
В программе по ссылке тоже должен быть wait().
1
4 / 4 / 2
Регистрация: 13.11.2012
Сообщений: 253
30.01.2016, 22:08  [ТС]
gng, c дочерними процессами более менее ясно. А что если требуется завершить родительский процесс раньше созданного ранее потомка? при завершении "родителем" становится init, как это реализовать? wait и waitpid работают только для дочерних процессов.
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
31.01.2016, 14:13
Цитата Сообщение от konsul777 Посмотреть сообщение
при завершении "родителем" становится init
Да
Цитата Сообщение от konsul777 Посмотреть сообщение
как это реализовать?
Просто завершаете родительский процесс (без wait). Дальше всё зависит от того, что вы ожидаете от дочернего процесса (становится даемоном или вызывает execve или ещё что).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.01.2016, 14:13
Помогаю со студенческими работами здесь

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

Последовательный вызов fork() из одного процесса
Допустим есть такой код: int main(int argc, char **argv) { fork(); fork(); fork(); fork(); ...

системный вызов fork();
Объясните пожалуйста что он делает(fork();)? #include &lt;stdio.h&gt; #include &lt;unistd.h&gt; int main() { fork();...

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

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


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

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

Новые блоги и статьи
Хак домофона или как открыть дверь по номеру
yariko 25.06.2025
Забыли дома ключ. Не проблема. Можно открыть дверь домофона, просто позвонив на свой номер квартиры. Идея состоит в следующем. Внутрь трубки абонента встраивается контроллер, который по звонку сам. . .
Как украсить новогоднюю елку с Q# и Qiskit
EggHead 24.06.2025
Что может быть необычнее, чем применить законы квантовой механики для украшения новогодней елки? Пока другие развешивают обычные гирлянды, я решил объединить свою страсть к квантовым вычислениям с. . .
Системы нулевого доверия на C#
UnmanagedCoder 24.06.2025
Традиционная архитектура безопасности работает по принципу средневекового замка: создаём высокие стены вокруг корпоративной сети, укрепляем ворота межсетевыми экранами и системами обнаружения. . .
Снова не мой путь. Циклическое среднее, я обеими руками за проверку условия, в ракурсе данной задачи - циклическое среднее в топку.
Hrethgir 24.06.2025
Привет. Такой вопрос - нужно выводить среднее математическое между двумя направлениями, интервал значений которых может лежать в диапазоне одного оборота по кругу. Проблема заключается в том, что. . .
Деплой Flask приложения
py-thonny 23.06.2025
За годы работы с Flask я натыкался на одни и те же грабли достаточно часто, чтобы наконец научится их обходить. И сегодня хочу поделится опытом, который сбережет вам немало нервных клеток. Начнем с. . .
WebAssembly и контейнеры в .NET Aspire для оркестрации распределенных архитектур
ArchitectMsa 23.06.2025
Я наблюдаю, как WebAssembly (или просто WASM) постепенно выходит за рамки своего первоначального предназначения — исполнения кода на стороне браузера. Теперь эта технология проникает в серверную. . .
Непрерывная интеграция для пакета Python
Mr. Docker 22.06.2025
Было 4 часа утра пятницы, когда я выпустил новую версию нашей внутренней библиотеки для обработки данных. Релиз 0. 5. 2 содержал небольшой фикс для обработки дат в ISO формате, что может пойти не так?. . .
Продвинутый ETL на C# из OLTP БД в хранилище
stackOverflow 22.06.2025
Работая в сфере корпоративной аналитики, я постоянно сталкиваюсь с одним и тем же - нужны чистые, структурированные и, главное, свежие данные. Без них современные аналитические системы, машинное. . .
Мастер-класс по микросервисам на Node.js
Reangularity 21.06.2025
Node. js стал одной из самых популярных платформ для микросервисной архитектуры не случайно. Его неблокирующая однопоточная модель и событийно-ориентированный подход делают его идеальным для. . .
Управление Arduino из WPF приложения
Wired 21.06.2025
Зачем вообще связывать Arduino с WPF-приложением? Казалось бы, у Arduino есть собственная среда разработки, своя экосистема, свои способы управления. Однако при создании серьезных проектов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru