LINUX.ORG.RU

[C] Как реализуется prefork?

 


0

0

Тут потребовалось написать сервер некоторый и появился вопрос, как апач и все прочие работают?

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

★★★

Вот самое примитивное что нашёл

................. 
while (1) {
    struct sockaddr_in remote_address;
    socklen_t address_length;
    int connection;
    pid_t child_pid;
    address_length = sizeof (remote_address);
    connection = accept (server_socket, (struct sockaddr *)&remote_address, &address_length);
    if (connection == -1) {

      if (errno == EINTR)
	continue;
      else
	system_error ("accept");
    }

    if (verbose) {
      socklen_t address_length;
      address_length = sizeof (socket_address);
      rval = getpeername (connection, (struct sockaddr *)&socket_address, &address_length);
      assert (rval == 0);

      printf ("connection accepted from %s\n", inet_ntoa (socket_address.sin_addr));
    }

    child_pid = fork ();
    if (child_pid == 0) {
      close (STDIN_FILENO);
      close (STDOUT_FILENO);
      close (server_socket);
      handle_connection (connection);
      close (connection);
      exit (0);
    }
    else if (child_pid > 0) {
      close (connection);
    }
    else
    system_error ("fork");
  }
}

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Boy_from_Jungle

Это fork а не prefork.

Разница в том что апач при запуске порождает кучу процессов и потом они живут вместе, а здесь процессы порождаются при подключении.

vahvarh ★★★
() автор топика
Ответ на: комментарий от Boy_from_Jungle

Недавно был феерический тред как раз в толксах, я тебе его вкратце перескажу: «в линуксе нет тредов».

vahvarh ★★★
() автор топика
Ответ на: комментарий от Boy_from_Jungle

(что-то я после весёлой ночи плохо соображаю.)
Сам не смотрел на тот же апач?

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Pavval

здесь чего-то было.
а вообще по комментам zabivator и catap пошляйся, они когда не сильно пьяные много интересного рассказывают, благо опыт работы с высоконагруженными системами есть.
http://www.linux.org.ru/forum/talks/4678585?lastmod=1269135012506

vahvarh ★★★
() автор топика
Ответ на: комментарий от vahvarh

я тебе его вкратце перескажу: «в линуксе нет тредов».

Ты слишком обобщаешь.

Boy_from_Jungle ★★★★
()

как ему передаётся (что интереснее) сам сокет?

Сам не писал такого, но ЕМНИП у Стивенса говорится, что делается через UNIX Domain Sockets, собственно в первом томе UNIX Network Programming надо смотреть.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

То есть ты хочешь сказать что центральный процесс (пере)запрашивает данные у другого процесса?
Врядли.

vahvarh ★★★
() автор топика

и как ему передаётся (что интереснее) сам сокет?

sendmsg SCM_RIGHTS

vga ★★
()

а чем форк то мешает, он же быстрый и память изменяется в новом процессе только при записи

dimon555 ★★★★★
()

1. создаешь слушающий сокет
2. форкаешься
3. в каждом из процессов вызываешь accept и обслуживаешь заaccept'ченные сокеты
4. поздравляю, ты префоркнулся!

linuxfan
()
Ответ на: комментарий от vahvarh

То есть ты хочешь сказать что центральный процесс (пере)запрашивает данные у другого процесса?

Зачем? После accept() центральный процесс передаёт незанятой дочке дескриптор соединённого сокета, а дальше дочка уже сама общается с клиентом. Или я чего-то не понимаю?

Begemoth ★★★★★
()
Ответ на: комментарий от thesame

> а дескрипторы сокетов валидны в других процессах?

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

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

тогда получается так - сокет открытый в родителе после форка потомка тоже появляется в потомке?

vahvarh ★★★
() автор топика
Ответ на: комментарий от vahvarh

Да:

man fork

* The child inherits copies of the parent's set of open file descriptors. Each file descriptor in the child refers to the same open file description (see open(2)) as the corresponding file descriptor in the parent. This means that the two descriptors share open file status flags, current file offset, and signal-driven I/O attributes (see the description of F_SETOWN and F_SETSIG in fcntl(2)).

Laz ★★★★★
()

Писал я в свое время нечто такое на перле. Там было так:

  • Запускаешь основной сервак (он будет следить за количеством потоков)
  • Форкаешься нужное количество раз.
  • В каждом из потомков делаешь accept (здесь нужна блокировка)
  • Потомок, получивший входящее соединение, обрабатывает его и отваливается.
  • Основной сервер видит отвалившегося потомка и на его место форкает новый.

В качестве блокировки я использовал блокировку доступа к pid-файлу.

Torvus
()

Интересно, а если побаловаться с clone() и CLONE_FILES. Сам я не пробовал. Но думаю так можно создать процесс с общей таблицей файловых дескрипторов но разной памятью.

pathfinder ★★★★
()

На твой сервер будет большая нагрузка?!

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Boy_from_Jungle

Столько сколько прикажут.
В моём случае полагаю что долго и что подключения БУДУТ.

vahvarh ★★★
() автор топика
Ответ на: комментарий от vahvarh

После того как появился nptl треды таки появились.

Reset ★★★★★
()
Ответ на: комментарий от dilmah

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

Я имел ввиду SCM_RIGHTS и sendmsg.

Begemoth ★★★★★
()

Ну и цирк тут у вас...

LamerOk ★★★★★
()

рекомендую почитать apachedev.ru, например тут

ну и далее по линкам что интересно, смотреть в разделе архитектура, если что

ну и, понятное дело, сорцы - лучший источник инормации по теме устройству всяческих серверов :)

shty ★★★★★
()

а вообще, советую почитать «Сетевое программирование в Perl». Там вся теория доступно изложена

Torvus
()
Ответ на: комментарий от Torvus

>а вообще, советую почитать «Сетевое программирование в Perl». Там вся теория доступно изложена

Может лучше «Сетевое программирование на Фортране»?

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

>Может лучше «Сетевое программирование на Фортране»?

«Сетевое программирование на Visual BrainFuck.NET под Windows Server 2008 для чайников»

anonymous
()
Ответ на: комментарий от vahvarh

О да, в линуксе это называется легковесные процессы, суть от этого не меняется.

frey ★★
()
Ответ на: комментарий от Torvus

Думаю типа того, серверный сокет наследуется всеми процессами-потомками, так что сделать в них accept() не проблема, убиваться сразу после обработки тоже не обязательно, while(1) и синхронизацию вставить только.

frey ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.