Создаём копию процесса ( fork ) в Linux

Иногда возникает необходимость обрабатывать несколько клиентов или несколько потоков данных одновременно, для этого удобно воспользоваться форком процесса.
Плюсами данного подхода можно считать то, что при неудачном завершении или ошибке в коде, погибнет только один процесс, а не вся программа.
Итак приступим.
Заголовки:

#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;
}

Вот и всё ;

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий