Объясните про Fork, плз....
Модератор: Модераторы разделов
-
oakhead
- Сообщения: 49
Объясните про Fork, плз....
Добрейшего всем времени суток!
Всем известно, что есть такая функция fork(), которая создает копию процесса. Однако, сколько ни смотрел в литературу, не могу понять:
1. Ея практический смысл.
2. С чего начинается исполнение порожденного процесса : с main() или к-л другой точки входа?
Всем известно, что есть такая функция fork(), которая создает копию процесса. Однако, сколько ни смотрел в литературу, не могу понять:
1. Ея практический смысл.
2. С чего начинается исполнение порожденного процесса : с main() или к-л другой точки входа?
-
madskull
- Сообщения: 1019
- Статус: Экс-металлюга
Re: Объясните про Fork, плз....
Смысл - создание дочернего процесса, работающего параллельно с родительским.
А начинает выполняться сразу после вызова fork()
Если поискать, то можно найти и простейшие примеры.
А начинает выполняться сразу после вызова fork()
Если поискать, то можно найти и простейшие примеры.
ArchLinux / IceWM
-
d_Sun
- Сообщения: 291
Re: Объясните про Fork, плз....
(madskull @ Понедельник, 22 Августа 2005, 12:26) писал(а):Смысл - создание дочернего процесса, работающего параллельно с родительским.
А начинает выполняться сразу после вызова fork()
Если поискать, то можно найти и простейшие примеры.
Причем поискать можно даже по этому форуму
Моя подпись сильно длинная :)
-
polachok
- Бывший модератор
- Сообщения: 2199
- Статус: главный форумный маргинал
- ОС: gnu/linux
Re: Объясните про Fork, плз....
1. Ея практический смысл.
потом юзается обычно exec()
И немедленно выпил.
-
flook
- Сообщения: 585
- Статус: Просто flook
Re: Объясните про Fork, плз....
Единственный смысл fork - создание процесса. Ниодин из существующих (окромя init) не появился насвет неестесственным путем 
exec юзается не обычно, а от случая к случаю - apache, mysql и другие серверы плодят child-ов не для того чтобы exec пускать.
exec юзается не обычно, а от случая к случаю - apache, mysql и другие серверы плодят child-ов не для того чтобы exec пускать.
В каждом из нас спит гений... и с каждым днем все крепче...
-
mishaa
- Сообщения: 1
Re: Объясните про Fork, плз....
Рекомендую почитать Ю.Вахалия "Unix изнутри". Там есть подробное описание: что, зачем, почему и какие недостатки.
Сейчас сам учитываюсь :thumbsup:
Сейчас сам учитываюсь :thumbsup:
-
alastor
- Сообщения: 844
- Статус: ARCH'еноид
- ОС: Arch Linux current
Re: Объясните про Fork, плз....
Функция возвращает 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, плз....
case 0:
/*делаем то, что нужно в дочернем процессе, например "превращаем" его в другой посредством exec() */
break;
Не break, а exit() (если не было exec, конечно)
/*делаем то, что нужно в дочернем процессе, например "превращаем" его в другой посредством exec() */
break;
Не break, а exit() (если не было exec, конечно)
ArchLinux / IceWM
-
LilFox
- Сообщения: 137
- Статус: ^^.,
- ОС: Gentoo Linux
Re: Объясните про Fork, плз....
Ужас народ =)) - вас бы к своей тачке я бы неподпустил =)... Был у меня один покет - за пять минут съедал всю память с fork()'ом - из за херово организации самого кода
.
Ладно помниться я работал с fork()'ом когда страшно извращался над оптимизированием кода - сэмпл жив:
[MP]DisconNecT добавил в 28.08.2005 08:16
Ах да ЧУТЬ незабыл - короче первое дату ты непоюзашь между дочерним и род процессами общую - для каждой дочки - создаётся свой сегмент памяти почитай клон родительского, изменены только PID ну и еще по мелочи - вобщем пока это НЕ существенно, вотрое - вытекающее из первого, придется юзать пайп - что такое пайп, в двух словах - канал через которую гоняют дату два процесса, как раз и был создан для таких случаев
.
Третье - последнее, если вы не уничтожите fork(); процесс вовремя или вобще в нужное время - то прога просто сожрет память
- поверте ЭТО неприятно, код выше - как раз основан на то чтобы память не ел... Коменты я бахнул, еще когда сэмпл писал - так что необессудьте.
Any Questions!?
Ладно помниться я работал с 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.
Won't someone help me find my little Clare.
-
Ananas
- Сообщения: 64
Re: Объясните про Fork, плз....
([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, плз....
(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, плз....
По поводу зачем нужен fork(), посмотрите Beej's Guide to Network Programming
http://www.coding-zone.co.uk/cpp/articles/...ogramming.shtml
-- у него есть прекрасный пример сервера, использующего цикл accept/fork() -- в примерах к статье.
Good Luck,
UT
http://www.coding-zone.co.uk/cpp/articles/...ogramming.shtml
-- у него есть прекрасный пример сервера, использующего цикл accept/fork() -- в примерах к статье.
Good Luck,
UT
-
LilFox
- Сообщения: 137
- Статус: ^^.,
- ОС: Gentoo Linux
Re: Объясните про Fork, плз....
Для Ananas:
Проверено - нАСЕКОМЫХ нет, вернее был у меня инструмент один - ФОРК то как раз И жрал память, эм знаешь почему??? Потому что в цикле был - потому и жрал, стрый не уничтожался, создавался еще один.... Если хочешь проверить замути
- лично я уже приверил на личном опыте
.
[MP]DisconNecT добавил в 04.09.2005 19:33
P.S
offtopic:
Мда и еще, непойму я - зачем было цетировать все моё сообщение???
Проверено - нАСЕКОМЫХ нет, вернее был у меня инструмент один - ФОРК то как раз И жрал память, эм знаешь почему??? Потому что в цикле был - потому и жрал, стрый не уничтожался, создавался еще один.... Если хочешь проверить замути
[MP]DisconNecT добавил в 04.09.2005 19:33
P.S
offtopic:
Мда и еще, непойму я - зачем было цетировать все моё сообщение???
Best Wishes. LilFox
Won't someone help me find my little Clare.
Won't someone help me find my little Clare.
-
Ananas
- Сообщения: 64
Re: Объясните про Fork, плз....
([MP]DisconNecT @ Воскресенье, 04 Сентября 2005, 18:33) писал(а):Для Ananas:
Проверено - нАСЕКОМЫХ нет, вернее был у меня инструмент один - ФОРК то как раз И жрал память, эм знаешь почему??? Потому что в цикле был - потому и жрал, стрый не уничтожался, создавался еще один.... Если хочешь проверить замути- лично я уже приверил на личном опыте
.
то, что в скобках написано - внимательно читал? у тебя как раз и была форк-бомба (судя по описанию). и в этом случае память отжирает не форк, а кривые руки.
-
LilFox
- Сообщения: 137
- Статус: ^^.,
- ОС: Gentoo Linux
Re: Объясните про Fork, плз....
Ananas Я знаю, кстате не только у меня была, но уже впрочем неважно - все убили.
Вобщем то лучше сейчас с этим разобраться - чтобы потом не насиловать систему. А пример этот не мой - а чувака из беркли, так что... думайте сами.
Вобщем то лучше сейчас с этим разобраться - чтобы потом не насиловать систему. А пример этот не мой - а чувака из беркли, так что... думайте сами.
Best Wishes. LilFox
Won't someone help me find my little Clare.
Won't someone help me find my little Clare.