Что я делаю не так?
В этой строке вы ошибаетесь:
if (pids[j] = fork() < 0)
Из-за порядкаВ правилах операций / приоритетов в C ++ эта строка интерпретируется компилятором как:
if (pids[j] = (fork() < 0))
... то есть pids[j]
устанавливается в true (он же 1), если fork()
возвращает отрицательное значение или false (иначе 0) в противном случае.Это, вероятно, не то, что вы хотели.Вместо этого вы хотите написать:
if ((pids[j] = fork()) < 0)
... так что для pids[j]
будет установлено возвращаемое значение fork()
, а затем это значение будет проверено, чтобы определить, меньше ли ононуль.(Я всегда использую явные скобки в подобной ситуации, особенно потому, что я никогда не могу вспомнить правила приоритета операторов, а размещение явных скобок означает, что я [и будущие читатели кода] не должны их помнить)
С этим изменением (и добавлением строки iAmProcess = j+1;
, которую вы упомянули в своем комментарии, в начало цикла for - не стесняйтесь редактировать ваше сообщение для обновления фрагмента кода, кстати), я получаюэто вывод из вашей программы:
$ ./a.out
I am process 0
I am process 2
I am process 1
I am process 3
I am process 4
I am process 5
... что не совсем то, что вы ожидали (вывод не совсем в порядке), но это потому, что все дочерние процессы, которые вы порождаете, выполняются асинхронно с каждымдругие и не обязаны исполняться в каком-либо определенном порядке относительно друг друга.