Вы не проверяете правильное возвращаемое значение из shmget.
if (shmid<0){printf("shmget error");exit(1);};
Если вы это сделаете, вы обнаружите, что распределение было недействительным, потому что этот key_t уже существует, попробуйте другой - или создайте свой собственный уникальный:
key_t key = 1;
или
key_t key = ftok("megasuperrandom",'a');
Согласно "man ftok":
Как правило, попытка наилучшего усилия объединяет данный байт proj_id, младшие 16 битов номера индекса и младшие 8биты номера устройства в 32-битный результат.Коллизии могут легко произойти, например, между файлами в / dev / hda1 и файлами в /dev/sda1.
Так что вы, вероятно, захотите перебрать некоторые, пока не найдете работающий, в качестве альтернативыиспользовать ftok ().
Кроме того, если вы хотите, чтобы у детей были разные случайные числа, вы, вероятно, захотите использовать другую случайную функцию или переместить srand () для каждого ребенка.
Также вывозможно, стоит проверить "man waitpid".Он не ожидает завершения процесса, а только ожидает изменения состояния, что непредсказуемо.Если вы хотите убедиться, что процесс завершен, вам придется проверить статус возврата.