Прежде чем перейти к главному ... Я предполагаю, что вы положили туда #include <stdlib.h>
(а также <stdio.h>
и <unistd.h>
).
Это:
int *numArray = (int*) malloc (argc * sizeof(int));
банкабыть заменено на лучшую альтернативу:
int *numArray = malloc(argc * sizeof *numArray);
Приведение не требуется.Кроме того, лучше использовать sizeof *pointer
, так как если вам нужно изменить тип данных, указанный массивом, вам не нужно менять sizeof
.Кроме того, если вы забудете #include <stdlib.h>
, malloc()
вернет int
.Помещение приведения в основном говорит компилятору об этом молчать.Если вы не поставите приведение, вы получите диагностическое сообщение.
По хорошей привычке также лучше проверить возвращаемое значение malloc()
, например,
if (!numArray) {
return EXIT_FAILURE;
}
Кроме того, strtol()
лучше, чем atoi()
, так как первый обеспечивает проверку ошибок.
Nitpick: вам нужно поставить ;
после fork()
.
Если вам нужночтобы вернуть значение от ребенка к родителю, вы не можете делать то, что сделали: sum = p;
.Вместо этого вам следует создать другой канал, если операционная система не поддерживает двунаправленные каналы (вероятно, безопаснее это предположить).Я оставляю это как упражнение для вас.
Теперь write()
и read()
нужен их второй аргумент - указатель.Так, например, read()
должно быть:
read(fd[0], &sumBuf, sizeof sumBuf);
Аналогично для write()
.
Я не понимаю, что вы имеете в виду, почему вы не можете просто написатьmalloc()
в родительском процессе.Вы, конечно, можете, и это лучше, так как дочерний процесс, как я понимаю, не должен иметь доступа к выделенной памяти.
Теперь наиболее вероятной причиной segfault является неопределенное поведение, вызванное чтением за пределами привязанного массива.В этом случае argv
.Это, вероятно, проще объяснить, используя пример:
Если вы запустите его таким образом:
./a.out 1 2 3
argc
будет равно 4, то есть вы можете получить доступ только к argv[0]
to argv[3]
.Теперь вот подсказка: посмотрите на петли.