Сколько потоков будет создано данным C-форком - PullRequest
0 голосов
/ 29 декабря 2018

Рассмотрим код, указанный ниже:

#include <stdio.h> 
#include <unistd.h> 
int main() 
{ 
   fork(); 
   fork() && fork() || fork(); 
   fork();
   printf("forked\n"); 
   return 0; 
}

Вопрос в том, сколько раз будет напечатано forked.Согласно моему анализу, он должен быть напечатан 20 раз.Также этот ответ подтверждает то же самое.

Однако, когда я запускаю код на onlinegdb.com и ideone.com , они печатают его 18и 5 раз соответственно.Почему так?

1 Ответ

0 голосов
/ 29 декабря 2018

Ваш код не создает никаких потоков. Они называются Pthreads в Linux, и вы будете использовать pthread_create (3) (который используется внутри clone (2) ) для их создания.

Конечно, ваш код использует (неправильно) fork (2) , поэтому он создает процессов (если fork не работает).Обратите внимание, что fork трудно понять (и объяснить, поэтому я даже не буду здесь пытаться).Возможно, вам придется много читать об этом, например, fork wikipage, ALP и, возможно, Операционные системы: три простых компонента (обаиметь несколько глав , объясняющих это).

Вы должны справиться с ошибкой fork.Как объяснено здесь , для каждого fork необходимо рассмотреть три случая, и вам лучше переписать свой код, чтобы сделать не более одного fork на оператора (назначение, подобноеpid_t pida = fork();)

Кстати, вам лучше очищать стандартные потоки (и данные в их буферах) перед каждым fork.Я рекомендую использовать fflush (3) , вызывая fflush(NULL); перед каждым fork.

Обратите внимание, что каждый процесс имеет свой собственный (уникальный) pid (см. getpid (2) и учетные данные (7) ).Вы можете понять вещи лучше, если вы напечатаете это, поэтому попробуйте использовать что-то вродеprintf("forked in %ld\n", (long) getpid());

когда я запускаю код

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

они печатают его 18 и 5 раз соответственно,Почему так?

Бесплатные веб-службы должны ограничивать ресурсы, используемые внешними клиентами (в Linux они, вероятно, будут использовать setrlimit (2) для этой цели).Очевидно, что такие сайты, дающие возможность запускать почти произвольный код C, хотят избегать разветвленных бомб .Весьма вероятно, что некоторые из ваших fork -s не сработали на них (и поскольку ваш исходный код не проверял на наличие сбоев, вы этого не заметили).

Даже на своем рабочем столе вы не могли создать много процессов.Как правило, на вашем компьютере может быть несколько сотен процессов, большинство из которых бездействуют (ожидающие, возможно, с poll (2) или блокирующим read(2) , и т. Д. ... для некоторого ввода-вывода или для некоторого тайм-аута, см. Также time (7) ), и только дюжина из них может быть запущена (планировщиком процесса ) вашего ядра ).Другими словами, процесс является довольно дорогостоящим вычислительным ресурсом.Если у вас слишком много запущенных процессов, вы можете поэкспериментировать thrashing .

Использовать ps (1) и top (1) (а также htop и pgrep (1) ) для запроса процессов в вашей системе Linux.Если вы хотите сделать это программно, используйте /proc/ (и смотрите proc (5) для более подробной информации) - который используется ps, top, pgrep, htop и т. Д...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...