Показать количество процессов в цикле с вилкой

Как я могу отобразить количество созданных процессов?
(без использования формулы)

for (i=0; i<3; i++)
fork();
count = count + 1;
printf("%d",count);

2 ответа

Решение

Есть несколько способов сделать это, и хорошая техника состоит в том, чтобы каждый дочерний элемент записал один байт в дескриптор файла, который может прочитать исходный процесс. Обратите внимание, что для краткости следующий код не содержит абсолютно никакой проверки ошибок. Кроме того, мы сообщаем только количество порожденных процессов (7) вместо подсчета оригинала, чтобы получить счет 8:

int main(void) {
    int fd[2];
    int depth = 0; /* keep track of number of generations from original */
    int i;
    pipe(fd);  /* create a pipe which will be inherited by all children */
    for(i=0; i<3; i++) {
        if(fork() == 0) {  /* fork returns 0 in the child */
            write(fd[1], &i, 1);  /* write one byte into the pipe */
            depth += 1;
        }
    }
    close(fd[1]);  /* exercise for the reader to learn why this is needed */
    if( depth == 0 ) { /* original process */
      i=0;
      while(read(fd[0],&depth,1) != 0)
        i += 1;
      printf( "%d total processes spawned", i);
    }

    return 0;
}

Распечатать значение счетчика всего один раз - это просто. Потому что вы можете получить pid процесса перед циклом for. А затем снова получите pid после цикла for и печатайте, только если pids совпадают. Что касается подсчета, это зависит от того, завершается ли ваш дочерний процесс или нет. Если они выходят, решение легче. Приведенный ниже код демонстрирует одно возможное решение, если дочерние процессы завершают работу (для краткости не сделали полную проверку ошибок). Идея состоит в том, что каждый дочерний процесс учитывает своих собственных детей. Родитель ждет завершения каждого ребенка и добавляет его количество. У вас не было времени полностью протестировать / отладить программу, поэтому могут быть некоторые ошибки. Но, надеюсь, дает вам общую идею.

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main(void)
{
    pid_t before_pid, after_pid;
    pid_t forked_pid;
    int count;
    int i;
    int status;

    before_pid = getpid();
    count = 1; /* count self */
    for (i = 0; i < 3; i++) {
        forked_pid = fork();

        if (forked_pid > 0) {
            waitpid(forked_pid, &status, 0);
            /* parent process - count child and descendents */
            count += WEXITSTATUS(status); 
        } else {
            /* Child process - init with self count */
            count = 1;
        }
    }

    after_pid = getpid();
    if (after_pid == before_pid) {
        printf("%d processes created\n", count);
    }

    return (count);
}
Другие вопросы по тегам