я пробовал оба fork () и vfork () и получил float pt excp с помощью fork и ошибку сегмента с vfork. без видимой причины, когда я использую vfork (), он выходит из дочернего процесса, но не входит в родительский, а затем вызывает ошибки. когда я использую fork (), он входит в родительский объект, но дает мне float pt excep. есть идеи?
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int sum = 0;
int i = 0;
pid_t pID;
int main()
{
pID = vfork();
if (pID > 0)
{
std::cout<< "b4 NULL"<< i<< "__"<< sum << std::endl;
wait(NULL);
std::cout<< "after NULL"<< i<< "__"<< sum << std::endl;
int avg = sum/i;
std::cout<<avg;
}
else if (pID == 0)
{
int J = 0;
std::cout<<sum<<"__"<<i<<std::endl;
i=0;
sum=0;
std::cout<<"enter a num:";
std::cin>>J;
while(J != -1)
{
sum += J;
std::cout<<"enter a num:";
std::cin>>J;
i++;
}
//int avg = sum/i;
//std::cout<<avg;
std::cout<<"exit child"<< i << "__" << sum << "__" << sum/i << std::endl;
//return(sum);
}
else
{
std::cerr << "Failed to fork" << std::endl;
return 1;
}
return 0;
}
Вы не можете использовать vfork
Вот.
«… поведение не определено, если процесс создан vfork () или изменяет любые данные кроме переменной типа pid_t, используемой для хранения возвращаемого значения из vfork () или возврата из функции, в которой был вызван vfork (), или вызывает любую другую функцию перед успешным вызовом _exit () или одной из функций семейства exec. «- vfork
Ваш ребенок изменяет данные, звонки operator<<
и все виды вещей, которые не допускаются. Так что это не сработает.
С fork
Вы делите на ноль:
int i = 0;
pid_t pID;
int main()
{
pID = fork(); /* changed to fork */
if (pID > 0)
{
std::cout<< "b4 NULL"<< i<< "__"<< sum << std::endl;
wait(NULL);
std::cout<< "after NULL"<< i<< "__"<< sum << std::endl;
int avg = sum/i; /* division by zero */
Без изменений кода i
, а также i
значение равно нулю. Таким образом, вы делите на ноль здесь.
Вы делите на ноль в родительском коде:
int avg = sum/i;
Блок if (pID == 0) предназначен для дочернего элемента, и когда вы выполняете разветвление, дочерний процесс создается как клон исходного запущенного процесса, но в отдельном адресном пространстве переменная sum не разделяется, а имеет отдельные копии в ребенок и родитель, нет обмена. Для совместного использования вам нужна общая память или канал. Чтобы использовать глобальные данные в одном и том же адресном пространстве, вам нужно создавать / использовать потоки, а не процессы.