Изучение системного вызова Fork: подробное руководство с примерами кода

Системный вызов fork — это фундаментальная функция операционных систем, позволяющая создавать новые процессы. Он широко используется в системном программировании и играет решающую роль в различных приложениях. В этой статье мы углубимся в системный вызов fork, обсудим его назначение, функциональность и предоставим многочисленные примеры кода, иллюстрирующие его использование в различных сценариях.

Понимание системного вызова fork:
Системный вызов fork создает новый процесс путем дублирования существующего процесса. Новый процесс, известный как дочерний процесс, является точной копией родительского процесса, за исключением нескольких атрибутов. Эти атрибуты включают идентификатор процесса (PID), идентификатор родительского процесса (PPID) и уникальную таблицу дескрипторов файлов.

Пример кода 1: базовое разветвление

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
    pid_t pid = fork();

    if (pid == -1) {
        printf("Fork failed\n");
        return 1;
    }

    if (pid == 0) {
        printf("Child process\n");
    } else {
        printf("Parent process\n");
    }

    return 0;
}

Пример кода 2: разветвление с использованием связи

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main() {
    int pipefd[2];
    char buffer[20];

    if (pipe(pipefd) == -1) {
        printf("Pipe creation failed\n");
        return 1;
    }

    pid_t pid = fork();

    if (pid == -1) {
        printf("Fork failed\n");
        return 1;
    }

    if (pid == 0) {
        close(pipefd[0]);
        write(pipefd[1], "Hello from child", 16);
        close(pipefd[1]);
        exit(0);
    } else {
        close(pipefd[1]);
        read(pipefd[0], buffer, sizeof(buffer));
        printf("Parent received: %s\n", buffer);
        close(pipefd[0]);
        wait(NULL);
    }

    return 0;
}

Пример кода 3: разветвление цикла

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
    int i;

    for (i = 0; i < 3; i++) {
        pid_t pid = fork();

        if (pid == -1) {
            printf("Fork failed\n");
            return 1;
        }

        if (pid == 0) {
            printf("Child process %d\n", i+1);
            return 0;
        }
    }

    printf("Parent process\n");

    return 0;
}

Системный вызов fork — это мощный механизм создания процессов в операционных системах. В этой статье мы рассмотрели его назначение и функциональность, приведя несколько примеров кода, демонстрирующих его универсальность. Понимая системный вызов fork, разработчики могут использовать его возможности для создания сложных приложений и выполнения различных задач, таких как межпроцессное взаимодействие, параллельная обработка и т. д.

Эффективно используя системный вызов fork, разработчики могут использовать весь потенциал управления процессами в своих программах, повышая эффективность и масштабируемость.