В чем реальный, прикладной смысл применения функции fork и execve?
//Читаю книгу по программированию в Linux. Уперся в тему многозадачности, не понимаю в чем суть применения данных функций. По большому счету смысл мне понятен(глобально), но, при непосредственном исследовании кода не особо..
//Есть задание: Выполнить программу вывода из файла в файл с помощью функции fork. Сам синтаксис я вывожу, например, самая простая программа с использование fork() :
#include <unistd.h>
#include <stdio.h>
int main (void)
{
fork ();
printf ("Hello World\n");
sleep (15);
return 0;
}
//Это все понятно.И результат мне ясен: создание 2 процессов(родительского и дочернего).Но зачем создавать 2 одинаковых процесса и в дальнейшем уже изменять полученный, когда можно создать без функции fork() новый процесс без клонирования.
1)Концепция развилки: fork() Для порождения нового процесса предназначен системный вызов fork() Системный вызов fork() порождает процесс методом "клонирования". Это значит, что новый процесс является точной копией своего родителя и выполняет ту же са- мую программу.
2)Системный вызов execve() загружает в процесс другую программу и передает ей безвозвратное управление.
Ответы (1 шт):
В линуксе есть только один официальный способ создать новый процесс - сделать fork, и все. Но так как два одинаковые процессы обычно не нужны, то в одном из них выполняется exec* функция, для замены программы нужной.
С одной стороны это странно, но с другой - гибко - можно передать запускаемой программе практически что угодно - параметры, файловые дескрипторы, права доступа на файлы и так далее. К примеру, так работает апач. Есть один процесс с "большими правами", он слушает 80/443 порт (обычный процесс этого так просто не может делать), когда появляется соединение, он форкает себя, понижает права и отдает и продолжает обработку. Если процесс попытается сделать что то плохое (файлы системные потрогать) - у него не получится. Если упадет - ну ничего плохого тоже не произойдет.