2015-04-01 7 views
1

Я пытаюсь найти способ подсчета количества процессов, созданных в цикле for длиной 10 с вызовом fork(). Легко видеть, что результат равен 2^n для n вызовов, но мне нужен способ вычислить его в программе.Подсчитать количество процессов, созданных с использованием fork в цикле for

Я нашел почти идентичный вопрос в here. Однако, когда я тестировал второе решение, данное здесь, он работает нормально для нескольких вилок меньше 10. Для 10 он задерживает 256. Почему? И есть ли другое решение этой проблемы? (кроме использования труб). Вот фактический код:

for(i=1; i<=10; i++) { 
    fork(); 
    printf("The process with the PID=%d\n", getpid()); 
} 
+0

Откуда берутся 256, это в этом printf? – teppic

+0

Это не исходит из приведенной здесь последовательности кода, она исходит из printf в решении, указанном в ссылке. Должен ли я опубликовать этот код? – user2971971

+0

Я не смотрел код, но я знаю, что 'fork' возвращает -1, когда он терпит неудачу, что может привести к этому 256. – teppic

ответ

2

Существует только один байт для статуса выхода процесса. Следовательно, вы не можете считать выше 255 с помощью кодов выхода из процесса. Кроме того, это причуда конкретного алгоритма, который вы пытались сделать, чтобы получить точно максимально возможный статус выхода (к которому родительский процесс добавляет 1, чтобы получить 256). Функция exit() использует только наименее значимые 8 бит своего аргумента (и возврат x от main() имеет тот же эффект, что и вызов exit(x)).

Чтобы сосчитать больше, вам нужен другой подход. Вы можете установить счетчик в общей памяти, и каждый дочерний процесс увеличивает его (с соответствующей синхронизацией). Это работает чисто, но общая память не является тривиальной для работы. Вы также можете добавить каждый процесс в файл, чтобы оставить запись; родительский процесс может затем прочитать файл, чтобы подсчитать, сколько процессов осталось от такой записи.

0

Что-то может ограничивать программу до 256 процессов. Проверьте возвращаемое значение fork(), не просто предполагайте, что он будет успешным каждый раз.

Что происходит, когда вы запускаете ulimit -u в командной строке?

0

ответил я ужасно похожий вопрос отвечал на Quora здесь: http://www.quora.com/For-I-0-I-3-I++-fork-how-can-I-make-an-algorithm-to-count-the-number-of-processes-and-display-it-only-once/answer/Richard-Conto

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

Смежные вопросы