Объясните про Fork, плз....

Модератор: Модераторы разделов

oakhead
Сообщения: 49

Объясните про Fork, плз....

Сообщение oakhead »

Добрейшего всем времени суток!

Всем известно, что есть такая функция fork(), которая создает копию процесса. Однако, сколько ни смотрел в литературу, не могу понять:
1. Ея практический смысл.
2. С чего начинается исполнение порожденного процесса : с main() или к-л другой точки входа?
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Объясните про Fork, плз....

Сообщение madskull »

Смысл - создание дочернего процесса, работающего параллельно с родительским.
А начинает выполняться сразу после вызова fork()

Если поискать, то можно найти и простейшие примеры.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: Объясните про Fork, плз....

Сообщение d_Sun »

(madskull @ Понедельник, 22 Августа 2005, 12:26) писал(а):Смысл - создание дочернего процесса, работающего параллельно с родительским.
А начинает выполняться сразу после вызова fork()

Если поискать, то можно  найти и простейшие примеры.


Причем поискать можно даже по этому форуму :D
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
polachok
Бывший модератор
Сообщения: 2199
Статус: главный форумный маргинал
ОС: gnu/linux

Re: Объясните про Fork, плз....

Сообщение polachok »

1. Ея практический смысл.

потом юзается обычно exec()
И немедленно выпил.
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Объясните про Fork, плз....

Сообщение flook »

Единственный смысл fork - создание процесса. Ниодин из существующих (окромя init) не появился насвет неестесственным путем ;)

exec юзается не обычно, а от случая к случаю - apache, mysql и другие серверы плодят child-ов не для того чтобы exec пускать.
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
mishaa
Сообщения: 1

Re: Объясните про Fork, плз....

Сообщение mishaa »

Рекомендую почитать Ю.Вахалия "Unix изнутри". Там есть подробное описание: что, зачем, почему и какие недостатки.

Сейчас сам учитываюсь :thumbsup:
Спасибо сказали:
Аватара пользователя
alastor
Сообщения: 844
Статус: ARCH'еноид
ОС: Arch Linux current

Re: Объясните про Fork, плз....

Сообщение alastor »

Функция возвращает pid процесса. Для дочернего - это 0, для родительского - pid дочернего. Дальше обычно идет проверка типа

Код: Выделить всё

pid=fork();
switch (pid){
 case 0:
   /*делаем то, что нужно в дочернем процессе, например "превращаем" его в другой посредством exec() */
  break;
 case -1:
  /*Вроде как при -1 - ошибка, процесс не создается*/
  break;
 default:
   /*А тут продолжается родительский процесс*/
}
Если че напутал, поправьте

[b]alastor[/b] добавил в [b][mergetime]1124727215[/mergetime][/b]

Функция возвращает pid процесса. Для дочернего - это 0, для родительского - pid дочернего. Дальше обычно идет проверка типа
[code]
pid=fork();
switch (pid){
 case 0:
   /*делаем то, что нужно в дочернем процессе, например "превращаем" его в другой посредством exec() */
  break;
 case -1:
  /*Вроде как при -1 - ошибка, процесс не создается*/
  break;
 default:
   /*А тут продолжается родительский процесс*/
}

Если че напутал, поправьте
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Объясните про Fork, плз....

Сообщение madskull »

case 0:
/*делаем то, что нужно в дочернем процессе, например "превращаем" его в другой посредством exec() */
break;

Не break, а exit() (если не было exec, конечно)
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
LilFox
Сообщения: 137
Статус: ^^.,
ОС: Gentoo Linux

Re: Объясните про Fork, плз....

Сообщение LilFox »

Ужас народ =)) - вас бы к своей тачке я бы неподпустил =)... Был у меня один покет - за пять минут съедал всю память с fork()'ом - из за херово организации самого кода :).
Ладно помниться я работал с fork()'ом когда страшно извращался над оптимизированием кода - сэмпл жив:

Код: Выделить всё

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

int main(int argc, char** argv)
{
 char string[256]="owner";
 char buf[80];
 printf("STRING: %s\n",string);
 int i;
 int fifo[2];
 //Create the PIPE
 if (pipe(fifo)==-1) perror("pipe"), exit(1);

 pid_t child = fork();
 int status;
 switch ( child )
 {
  case 0:
     sleep(2);
     printf("Child Was Created\n");
     strcpy(string,"sender");
     printf("Child String: %s\n", string);
     //fifo filling
     close(fifo[0]);
     write(fifo[1],"sender",80);
     close(fifo[1]);
     _exit(0);
     kill(child, SIGINT);
     return 0;
     break;
  case (pid_t)-1:
   perror("fork");
   break;
  default:
    close(fifo[1]);//
    while (read(fifo[0],buf,80)) printf("%s\n",buf);
    while(strcasecmp(buf,"sender"))
     {
      printf("buf: %s\n",buf);
      sleep(1);
     }
     printf("Parent was created successfully\n");
     waitpid(child,&status,WUNTRACED);
     //printf("Child was %i\n",child);
     break;
  }
 if (WIFEXITED(status))
  printf("%i exits: %i\n",child, WEXITSTATUS(status));
 else if (WIFSTOPPED(status))
  printf("%i stopped by: %i\n",child,WSTOPSIG(status));
 else if (WIFSIGNALED(status))
  printf("%i killed by: %i\n", child, WTERMSIG(status));
 else perror("waitpid");
 while (strcasecmp(string,":q"))
  {
   scanf("%s",string);
  }
 return 0;
 _exit(0);
}


[MP]DisconNecT добавил в 28.08.2005 08:16

Ах да ЧУТЬ незабыл - короче первое дату ты непоюзашь между дочерним и род процессами общую - для каждой дочки - создаётся свой сегмент памяти почитай клон родительского, изменены только PID ну и еще по мелочи - вобщем пока это НЕ существенно, вотрое - вытекающее из первого, придется юзать пайп - что такое пайп, в двух словах - канал через которую гоняют дату два процесса, как раз и был создан для таких случаев ;).
Третье - последнее, если вы не уничтожите fork(); процесс вовремя или вобще в нужное время - то прога просто сожрет память ;) - поверте ЭТО неприятно, код выше - как раз основан на то чтобы память не ел... Коменты я бахнул, еще когда сэмпл писал - так что необессудьте.

Any Questions!?
Best Wishes. LilFox
Won't someone help me find my little Clare.
Спасибо сказали:
Ananas
Сообщения: 64

Re: Объясните про Fork, плз....

Сообщение Ananas »

([MP) писал(а):DisconNecT,Воскресенье, 28 Августа 2005, 7:16]Ужас народ =)) - вас бы к своей тачке я бы неподпустил =)... Был у меня один покет - за пять минут съедал всю память с fork()'ом - из за херово организации самого кода :).
Ладно помниться я работал с fork()'ом когда страшно извращался над оптимизированием кода - сэмпл жив:

Код: Выделить всё

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

int main(int argc, char** argv)
{
 char string[256]="owner";
 char buf[80];
 printf("STRING: %s\n",string);
 int i;
 int fifo[2];
 //Create the PIPE
 if (pipe(fifo)==-1) perror("pipe"), exit(1);

 pid_t child = fork();
 int status;
 switch ( child )
 {
  case 0:
     sleep(2);
     printf("Child Was Created\n");
     strcpy(string,"sender");
     printf("Child String: %s\n", string);
     //fifo filling
     close(fifo[0]);
     write(fifo[1],"sender",80);
     close(fifo[1]);
     _exit(0);
     kill(child, SIGINT);
     return 0;
     break;
  case (pid_t)-1:
   perror("fork");
   break;
  default:
    close(fifo[1]);//
    while (read(fifo[0],buf,80)) printf("%s\n",buf);
    while(strcasecmp(buf,"sender"))
     {
      printf("buf: %s\n",buf);
      sleep(1);
     }
     printf("Parent was created successfully\n");
     waitpid(child,&status,WUNTRACED);
     //printf("Child was %i\n",child);
     break;
  }
 if (WIFEXITED(status))
  printf("%i exits: %i\n",child, WEXITSTATUS(status));
 else if (WIFSTOPPED(status))
  printf("%i stopped by: %i\n",child,WSTOPSIG(status));
 else if (WIFSIGNALED(status))
  printf("%i killed by: %i\n", child, WTERMSIG(status));
 else perror("waitpid");
 while (strcasecmp(string,":q"))
  {
   scanf("%s",string);
  }
 return 0;
 _exit(0);
}


[MP]DisconNecT добавил в 28.08.2005 08:16

Ах да ЧУТЬ незабыл - короче первое дату ты непоюзашь между дочерним и род процессами общую - для каждой дочки - создаётся свой сегмент памяти почитай клон родительского, изменены только PID ну и еще по мелочи - вобщем пока это НЕ существенно, вотрое - вытекающее из первого, придется юзать пайп - что такое пайп, в двух словах - канал через которую гоняют дату два процесса, как раз и был создан для таких случаев ;).
Третье - последнее, если вы не уничтожите fork(); процесс вовремя или вобще в нужное время - то прога просто сожрет память ;) - поверте ЭТО неприятно, код выше - как раз основан на то чтобы память не ел... Коменты я бахнул, еще когда сэмпл писал - так что необессудьте.

Any Questions!?


общие данные - man ipc на предмет шареной памяти.
если процесс сжирает всю память - форк тут ни причем (если, конечно, не делали fork bomb) - ищите лики.
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Объясните про Fork, плз....

Сообщение flook »

(Ananas @ Воскресенье, 28 Августа 2005, 9:24) писал(а):общие данные  - man ipc на предмет шареной памяти.
если процесс сжирает всю память - форк тут ни причем (если, конечно, не делали fork bomb) - ищите лики.

Общие данные - лучше курите mmap с флагами MAP_ANON и MAP_SHARED или для "глобаллистов" флаг CLONE_VM для sys_clone.
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Объясните про Fork, плз....

Сообщение Uncle_Theodore »

По поводу зачем нужен fork(), посмотрите Beej's Guide to Network Programming
http://www.coding-zone.co.uk/cpp/articles/...ogramming.shtml
-- у него есть прекрасный пример сервера, использующего цикл accept/fork() -- в примерах к статье.

Good Luck,
UT
Спасибо сказали:
Аватара пользователя
LilFox
Сообщения: 137
Статус: ^^.,
ОС: Gentoo Linux

Re: Объясните про Fork, плз....

Сообщение LilFox »

Для Ananas:
Проверено - нАСЕКОМЫХ нет, вернее был у меня инструмент один - ФОРК то как раз И жрал память, эм знаешь почему??? Потому что в цикле был - потому и жрал, стрый не уничтожался, создавался еще один.... Если хочешь проверить замути ;) - лично я уже приверил на личном опыте ;).

[MP]DisconNecT добавил в 04.09.2005 19:33

P.S
offtopic:
Мда и еще, непойму я - зачем было цетировать все моё сообщение???
Best Wishes. LilFox
Won't someone help me find my little Clare.
Спасибо сказали:
Ananas
Сообщения: 64

Re: Объясните про Fork, плз....

Сообщение Ananas »

([MP]DisconNecT @ Воскресенье, 04 Сентября 2005, 18:33) писал(а):Для Ananas:
Проверено - нАСЕКОМЫХ нет, вернее был у меня инструмент один - ФОРК то как раз И жрал память, эм знаешь почему??? Потому что в цикле был - потому и  жрал, стрый не уничтожался, создавался еще один.... Если хочешь проверить замути ;) - лично я уже приверил на личном опыте ;).


то, что в скобках написано - внимательно читал? у тебя как раз и была форк-бомба (судя по описанию). и в этом случае память отжирает не форк, а кривые руки.
Спасибо сказали:
Аватара пользователя
LilFox
Сообщения: 137
Статус: ^^.,
ОС: Gentoo Linux

Re: Объясните про Fork, плз....

Сообщение LilFox »

Ananas Я знаю, кстате не только у меня была, но уже впрочем неважно - все убили.
Вобщем то лучше сейчас с этим разобраться - чтобы потом не насиловать систему. А пример этот не мой - а чувака из беркли, так что... думайте сами.
Best Wishes. LilFox
Won't someone help me find my little Clare.
Спасибо сказали: