Соглашения командной строки варьируются от ОС до ОС, но соглашение, это, вероятно, получило и большую часть использования, и большую часть общественного внимания, является тем, поддерживаемым GNU getopt пакет. См. http://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html для большего количества информации
, Она позволяет Вам смешивать однобуквенные команды, такой как - номер, с дольше, самодокументируя опции, такой как - числовой - реверс. Будьте хороши, и реализуйте - справка (-?) опция и затем Ваши пользователи будут в состоянии выяснить все, что они должны знать.
Вызов fork () порождает новый процесс, который начинает свое выполнение в той же точке , где произошла вилка. Итак, похоже, что fork «возвращает дважды»
. Здесь происходит то, что ваш вызов fork () возвращается дважды, поэтому и родительский, и дочерний процессы продолжают цикл и порождают новые процессы. Затем каждый дочерний элемент (как исходного родителя, так и потомка) снова разветвляется, многократно удваивая количество процессов ...
Каждый дочерний процесс берет и продолжает цикл.
Другими словами, дочерний процесс 1 порождается и продолжает итерацию №2 цикла и т. Д.
Когда процесс разветвляется, создается копия текущего процесса: полученный дочерний процесс продолжает выполнение после вызова fork (). Вот почему вы должны позаботиться о коде возврата в своей логике.
Попробуй ...
Эта обфускация обычно состоит из удаления комментариев и пробелов, кодирования base64 и иногда других маленьких уловок, таких как полное переименование каждой переменной и тому подобное, чтобы сделать ее почти невозможной для понимания людьми
official & client = firefox-aПопробуй ...
Эта обфускация обычно состоит из удаления комментариев и пробелов, кодирования base64, а иногда и других маленьких уловок, таких как полное переименование каждой переменной и тому подобное, чтобы сделать ее почти невозможной для понимания людьми
official & client = firefox-aПопробуй ...
Эта обфускация обычно состоит из удаления комментариев и пробелов, кодирования base64, а иногда и других маленьких уловок, таких как полное переименование каждой переменной и тому подобное, чтобы сделать ее почти невозможной для понимания людьми
Итак, происходит то, что дети сами продолжают цикл в собственном пространстве процесса (после того, как они распечатывают свой вывод) , а также , как это делает родитель. И, фактически, поскольку эти дети тоже разветвляются, внуки также будут продолжать жить с этого момента. Я уверен, что есть формула для определения того, сколько детей у вас в итоге будет (вероятно, что-то вроде N!), Но в данный момент у меня нет сил, чтобы это выяснить. Лучше использовать следующее решение.
Способ отличить родительский от дочернего - это возвращаемое значение из fork
.
не удалась. ждать
для него). Вот тестовый код:
#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> _