Попытка создать несколько процессов в C ++ с помощью fork ();не похоже на работу - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь создать родительский процесс с несколькими дочерними процессами, используя fork () в C ++.Я попытался использовать код из этого вопроса , чтобы создать простую программу, в которой каждый процесс имел бы счет вверх;родитель будет печатать «Я процесс 0», первый потомок «Я процесс 1» и т. д.

#include <unistd.h>
#include <stdio.h>
#include <fstream>
#include <sys/wait.h>
using namespace std;

const int PROCESSES = 5;
void Printer(int psno);
int iAmProcess = 0;

int main()
{

    int pids[PROCESSES];

    Printer(iAmProcess);

    for (int j = 0; j < PROCESSES; j++)
    {
        if (pids[j] = fork() < 0)
        {
            perror("Error in forking.\n");
            exit(EXIT_FAILURE);
        }
        else if (pids[j] == 0)
        {
            Printer(iAmProcess);
            exit(0);
        }
    }

    int status;
    int pid;
    int n = PROCESSES;
    while (n > 0)
    {
        pid= wait(&status);
        --n;
    }
    return 0;
}

void Printer(int psno)
{
    printf("I am process %d\n", psno);
}

Вместо ожидаемого результата:

I am process 0
I am process 1
I am process 2
I am process 3
I am process 4
I am process 5

Iget:

I am process 0
I am process 0
I am process 0
I am process 0

И тогда программа завершается.Что я делаю не так?

1 Ответ

0 голосов
/ 10 октября 2018

Что я делаю не так?

В этой строке вы ошибаетесь:

    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

... что не совсем то, что вы ожидали (вывод не совсем в порядке), но это потому, что все дочерние процессы, которые вы порождаете, выполняются асинхронно с каждымдругие и не обязаны исполняться в каком-либо определенном порядке относительно друг друга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...