Иногда возникает необходимость обрабатывать несколько клиентов или несколько потоков данных одновременно, для этого удобно воспользоваться форком процесса.
Плюсами данного подхода можно считать то, что при неудачном завершении или ошибке в коде, погибнет только один процесс, а не вся программа.
Итак приступим.
Заголовки:
#include <sys/types.h> #include <unistd.h> #include <iostream> #include <stdio.h> using namespace std;
И сразу приступим к наполнению функции main.
Объявим необходимые перменные:
pid_t pid; char *message; int n;
pid — для хранения pid процесса
message — указатель на текст для вывода
n — количество проходов циала.
Выводим сообщение о начале работы:
cout << "starting...\n";
Сразу же создаём форк. При этом функция вернёт pid процесса:
pid = fork();
Дочерний процесс при этом получит pid 0,
Если же в переменную попало -1 — следует обработать ошибку.
Для всех этих дел воспользуемся конструкцией switch :
switch(pid) { case -1: perror("fork error"); return 1; case 0: message = "this is child"; n = 5; break; default: cout << "parent exit..."; return 0; break; }
В то время как главный процесс закончил свою работу, дочерний выполняет инструкции дальше:
for (;n>0;n--) { puts(message); sleep(1); }
Выводим сообщение о работе дочернего процесса 5 раз.
Ну и программа целиком:
#include <sys/types.h> #include <unistd.h> #include <iostream> #include <stdio.h> using namespace std; int main() { pid_t pid; char *message; int n; cout << "starting...\n"; pid = fork(); switch(pid) { case -1: perror("fork error"); return 1; case 0: message = "this is child"; n = 5; break; default: cout << "parent exit..."; return 0; break; } for (;n>0;n--) { puts(message); sleep(1); } return 0; }
Вот и всё ;