Проблема, разветвляющая ветвление () несколько Unix процессов

Соглашения командной строки варьируются от ОС до ОС, но соглашение, это, вероятно, получило и большую часть использования, и большую часть общественного внимания, является тем, поддерживаемым GNU getopt пакет. См. http://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html для большего количества информации

, Она позволяет Вам смешивать однобуквенные команды, такой как - номер, с дольше, самодокументируя опции, такой как - числовой - реверс. Будьте хороши, и реализуйте - справка (-?) опция и затем Ваши пользователи будут в состоянии выяснить все, что они должны знать.

15
задан BobbyShaftoe 5 November 2009 в 18:46
поделиться

3 ответа

Вызов fork () порождает новый процесс, который начинает свое выполнение в той же точке , где произошла вилка. Итак, похоже, что fork «возвращает дважды»

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

14
ответ дан 1 December 2019 в 02:02
поделиться

Каждый дочерний процесс берет и продолжает цикл.

Другими словами, дочерний процесс 1 порождается и продолжает итерацию №2 цикла и т. Д.

Когда процесс разветвляется, создается копия текущего процесса: полученный дочерний процесс продолжает выполнение после вызова fork (). Вот почему вы должны позаботиться о коде возврата в своей логике.

1
ответ дан 1 December 2019 в 02:02
поделиться

http://www.google.com/search?q=php+code+obfuscator&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox- a

Попробуй ...

Эта обфускация обычно состоит из удаления комментариев и пробелов, кодирования base64 и иногда других маленьких уловок, таких как полное переименование каждой переменной и тому подобное, чтобы сделать ее почти невозможной для понимания людьми

official & client = firefox-a

Попробуй ...

Эта обфускация обычно состоит из удаления комментариев и пробелов, кодирования base64, а иногда и других маленьких уловок, таких как полное переименование каждой переменной и тому подобное, чтобы сделать ее почти невозможной для понимания людьми

official & client = firefox-a

Попробуй ...

Эта обфускация обычно состоит из удаления комментариев и пробелов, кодирования base64, а иногда и других маленьких уловок, таких как полное переименование каждой переменной и тому подобное, чтобы сделать ее почти невозможной для понимания людьми

Итак, происходит то, что дети сами продолжают цикл в собственном пространстве процесса (после того, как они распечатывают свой вывод) , а также , как это делает родитель. И, фактически, поскольку эти дети тоже разветвляются, внуки также будут продолжать жить с этого момента. Я уверен, что есть формула для определения того, сколько детей у вас в итоге будет (вероятно, что-то вроде N!), Но в данный момент у меня нет сил, чтобы это выяснить. Лучше использовать следующее решение.

Способ отличить родительский от дочернего - это возвращаемое значение из fork .

  • Если вы получаете -1, вы родитель и вилка не удалась.
  • Если вы вернете ноль, вы - ребенок.
  • Если вы вернете положительное число, вы » re родительский, и этот номер является дочерним PID (так что вы можете манипулировать им или ждать для него).

Вот тестовый код:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void forkChildren (int nChildren) {
    int i;
    pid_t pid;
    for (i = 1; i <= nChildren; i++) {
        pid = fork();
        if (pid == -1) {
            /* error handling here, if needed */
            return;
        }
        if (pid == 0) {
            printf("I am a child: %d PID: %d\n",i, getpid());
            sleep (5);
            return;
        }
    }
}

int main (int argc, char *argv[]) {
    if (argc < 2) {
        forkChildren (2);
    } else {
        forkChildren (atoi (argv[1]));
    }
    return 0;
}

и некоторые выходные данные, чтобы показать вам, что происходит:

pax> forktest 5
I am a child: 1 PID: 4188
I am a child: 2 PID: 4180
I am a child: 3 PID: 5396
I am a child: 4 PID: 4316
I am a child: 5 PID: 4260

pax> _
15
ответ дан 1 December 2019 в 02:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: