Самый отвратительный метод использует vfork()
и позволяет различным дочерним элементам растоптать разные части памяти перед выходом; потом родитель просто складывает измененные биты памяти.
Крайне не рекомендуется - но это единственный случай, с которым я сталкивался, когда 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
Иногда сумма переполняется - есть много возможностей для улучшения обработки.
Страница руководства Solaris для 'vfork()
' гласит:
В отличие от функции fork (), дочерний процесс занимает
память родителя и нить управления до вызова
execve () или выход (ненормально или вызовом
_exit () (см. exit (2)). Любые изменения, сделанные во время этого
время на любую часть памяти в дочернем процессе отражается
в родительском процессе по возвращении из vfork (). Родитель
процесс приостановлен, пока ребенок использует его ресурсы.
Это, вероятно, означает, что 'wait()
' не требуется в моем коде. (Однако попытка упростить код, казалось, заставляла его вести себя неопределенно. Очень важно, чтобы i
не менялся преждевременно; wait()
гарантирует, что синхронность. Использование _exit()
вместо execl()
также, казалось, нарушало вещи. Не используйте vfork()
, если вы цените свое здравомыслие - или если вы хотите, чтобы какие-либо оценки для вашей домашней работы.)