скверный метод использует vfork()
и позволяет различные дети топчут на разные части памяти перед выходом, родитель, то просто суммирует модифицированные биты памяти
Высоко unrecommended - но о.. только случай, когда я меня там, где vfork()
может действительно использовать.
Только для развлечений (шахты) я закодированы это вверх:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <sys/wait.h>
int main(void)
{
int i;
int array[5];
int square[5];
long sum = 0;
srand(time(0));
for (i = 0; i < 5; i++)
{
array[i] = rand();
if (vfork() == 0)
{
square[i] = array[i] * array[i];
execl("/bin/true", "/bin/true", (char *)0);
}
else
wait(0);
}
for (i = 0; i < 5; i++)
{
printf("in: %d; square: %d\n", array[i], square[i]);
sum += square[i];
}
printf("Sum: %d\n", sum);
return(0);
}
Это работает. Предыдущая версия с использованием «exit(0)
» вместо «execl()
» не работает; квадратная матрица была равна нулю. Пример вывод (32-битная компиляция на Solaris 10, SPARC):
in: 22209; square: 493239681
in: 27082; square: 733434724
in: 2558; square: 6543364
in: 17465; square: 305026225
in: 6610; square: 43692100
Sum: 1581936094
Иногда сумма переполняется - есть много возможностей для улучшения обработки этого.
страница
Солярис руководство для 'vfork()
говорит:
В отличие от функции вилки(), дочерний процесс заимствует память родителя и поток управления до вызова execve() или выход (либо ненормально, либо по вызову _exit() (см. exit (2)). Любая модификация, сделанная во время этого времени в любую часть памяти в дочернем процессе, отражается в родительском процессе при возврате из vfork() Родительский процесс приостанавливается, пока ребенок использует его ресурсы.
Это, вероятно, означает, что «wait()
» не нужен в моем коде. (Тем не менее, попытка упростить код, казалось, заставила его вести себя неопределенно. Очень важно, чтобы i
не менялся преждевременно: wait()
действительно гарантирует, что синхронизация. Использование _exit()
вместо execl()
также, казалось, нарушало ситуацию. Не используйте vfork()
, если вы цените свое здравомыслие - или если вам нужны какие-либо отметки для вашей домашней работы.)
Я бы использовал общую память – kylex
Возможно, вам не нужно делать сканирование; дети получают копию родительских данных процесса, поэтому (в отличие от примера vfork()) дети могут смотреть на счетчик, который сообщает им, какая запись принадлежит им. Вы можете предварительно загрузить память со случайными значениями; то дети знают, что данные готовы. –
Это будет работать, если вы просто используете fork (с родительским и дочерним кодом в одном и том же исполняемом файле), но не если вы выполняете команду для ввода дочернего элемента: пространство процесса перезаписывается (включая счетчик). В большинстве случаев не происходит много опасных вещей, которые разделяются между двумя вилами. Тем не менее, это вариант. – paxdiablo