При вызове fork()
создается новый процесс с отдельным пространством виртуальной памяти. Этот дочерний процесс вернется из вызова к fork с 0
, поэтому в вашем коде этот дочерний процесс перейдет внутрь ветви if и присвоит id[i]
его pid. Но это назначение происходит в отдельном процессе, с отдельной виртуальной памятью, поэтому оно не влияет на пространство виртуальной памяти родителей, и родитель не увидит никаких изменений в своем массиве. Вот почему ваш код печатает нули.
Если вы хотите напечатать pids дочерних элементов родителем, используйте возвращаемое значение fork (), которое в parent является pid дочернего процесса. Внутри for используйте такой код:
pid_t child_id;
switch (child_id = fork()) {
case -1:
//Fork failed, exit with error or something
break;
case 0:
//Child code
printf("ID[%d] = %d\n",i,id[i]);
if(i != 3) {
printf("I am a wharehouse. PID = [%d] PPID = [%d]\n",getpid(),getppid());
whcode();
exit(0);
}
else if(i == 3) {
printf("I am the central. PID = [%d] PPID = [%d]\n",getpid(),getppid());
central_code();
exit(0);
}
break;
default:
id[i] = child_id;
break;
}
Кстати, вы действительно должны объявить массив id как pid_t id[3]
, а при печати распечатывать его долго. На данный момент это, вероятно, самый портативный способ справиться с этими вещами.