wait () возвращает 0 и errno = & quot; прерванный системный вызов & quot;

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

Все работает довольно хорошо, но время от времени (примерно в 10% случаев я выполняю программу) wait(NULL) возвращает -1 и errno указывает Interrupted system call для одного из дочерних процессов. Я понятия не имею, почему это происходит на первый взгляд случайно.

В приведенном ниже коде MonteCarlo это пользовательский класс, который имеет дело с приближением Pi.

#include <random>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <unistd.h>
#include "MonteCarlo.h"

int main(int argc,char** argv){
int approximationProcessCount = 10;
int approximationRandomCount = 1000;for(int i=0; i<approximationProcessCount; i++){
//pidArray[i] = fork();
pid_t pid = fork();

if( pid == -1 ){
// Fork error
perror("Fork error");
}
else if( pid == 0 ){
// Child process
MonteCarlo mc(approximationRandomCount);
std::string filename(std::to_string(getpid()) + ".txt");
std::ofstream fs( filename );

if( !fs ){
std::cerr << "Cannot open '" << filename << "' for writing." << std::endl;
return 1;
}

fs << mc.approximate();
fs.flush();
fs.close();
return 0;
}
else{
// Parent process
}
}

// Parent process
double averageApproximation = 0.0;

for(int i=0; i<approximationProcessCount; i++){
pid_t childPid = wait(NULL);

if( childPid == -1 ){
perror( std::string("Error when waiting for child process [-1] (i=" + std::to_string(i) + ")").c_str());
continue;
}
else if( childPid == 0 ){
perror( std::string("Error when waiting for child process [0] (i=" + std::to_string(i) + ")").c_str());
continue;
}

std::string filename(std::to_string(childPid) + ".txt");
std::ifstream fs( filename );

if( !fs ){
std::cerr << "Cannot open '" << filename << "' for reading." << std::endl;
return 1;
}

double approximation;
fs >> approximation;
fs.close();
remove(filename.c_str());

// Calculate average "on the fly"averageApproximation += (approximation - averageApproximation)/(i+1);
}

std::cout << "Average approximation of Pi = " << averageApproximation << std::endl;

}

Когда я сталкиваюсь с «ошибкой», я получаю следующий вывод (i изменяется):

Error when waiting for child process [-1] (i=9): Interrupted system call
Average approximation of Pi = 3.14444

Я запускаю это в XCode на Mac OSx El Capitan.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]