Детский и родительский пид с вилкой ();

0

Я пытаюсь сделать программу, которая делает 9 дочерних процессов, поэтому я использую fork 9 раз, только если мы отец, вот так:

for (int i = 0; i < 9; i++) {   // Creo 9 hijos.
    if (child_pid > 0) {
        child_pid = fork();
        childs[i] = child_pid;
    }
    if (child_pid < 0)
        printf("Error...\n");
}

Теперь, я должен печатать на каждом ребенке, какими детьми он является, начиная с 0, поэтому я думал об этом:

printf("This is child #%d\n", getpid() - getppid());

Но я не уверен, всегда ли это работает? Что делать, если родитель создает детей, операционная система создает другой процесс?, Количество детей будет прекращено?. И, наконец, если да, то как я могу сделать, что дети #n знают, что он является номером детей n?.

  • 0
    Что если операционная система повторно использует идентификатор процесса?
  • 0
    Кроме того, как вы инициализируете child_pid ? И почему каждый ребенок выполняет остальную часть цикла? Почему бы вам не сохранить i для каждого ребенка, когда вы определили его как ребенка, если вы заинтересованы в этом?
Показать ещё 2 комментария
Теги:
fork

1 ответ

5

Вы можете использовать переменную i чтобы указать, к какому ребенку вы находитесь, но логика вашего цикла неверна. Это должно выглядеть так:

for (int i = 0; i < 9; ++i) {
    child_pid = fork();

    if (child_pid == 0) {
        // We are the child. The value of the i variable will tell us which one.
        // If i == 0 we are the first child, i == 1 and we are the second, and so on.
        printf("We are child #%d\n", i);
        exit(EXIT_SUCCESS);
    }

    if (child_pid < 0) {
        // Forking failed.
        perror("fork()");
        exit(EXIT_FAILURE);
    }

    // Otherwise we are the parent and forking was successful; continue the loop.
}

Операционная система не обязана назначать идентификаторы процессов в последовательном порядке. Если другой процесс использует следующий, он будет пропущен в последовательном методе присваивания, но ОС действительно может назначить случайное число в качестве pid, если оно не используется.

  • 0
    Да, но я должен знать, через каких детей я посылаю сигнал.
  • 0
    @OiciTrap Я не могу разобрать это предложение. Вы можете перефразировать это?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню