Совместное использование переменных между процессами в C с помощью fork()

Чтобы совместно использовать переменную между двумя процессами, созданными с помощью системного вызова fork()в C, вы можете использовать различные методы. Я объясню несколько часто используемых подходов на примерах кода:

  1. Общая память:
    Общая память позволяет процессам получать доступ к одной и той же области памяти. Вы можете создать сегмент общей памяти с помощью функции shmget()и присоединить его к процессам с помощью shmat(). Вот пример:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main() {
    int shmid;
    int *shared_variable;
    pid_t pid;
    shmid = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | 0666);
    if (shmid == -1) {
        perror("shmget");
        exit(1);
    }
    shared_variable = shmat(shmid, NULL, 0);
    if (shared_variable == (int *)-1) {
        perror("shmat");
        exit(1);
    }
    pid = fork();
    if (pid == 0) {
        // Child process
        *shared_variable = 42;
        printf("Child process: shared_variable = %d\n", *shared_variable);
        exit(0);
    } else if (pid > 0) {
        // Parent process
        wait(NULL);
        printf("Parent process: shared_variable = %d\n", *shared_variable);
    } else {
        // Fork failed
        perror("fork");
        exit(1);
    }
    shmdt(shared_variable);
    shmctl(shmid, IPC_RMID, NULL);
    return 0;
}
  1. Каналы.
    Каналы обеспечивают однонаправленный канал связи между процессами. Вы можете создать канал с помощью функции pipe()и передать конец канала записи одному процессу, а конец чтения другому процессу. Вот пример:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
    int pipefd[2];
    int shared_variable;
    pid_t pid;
    if (pipe(pipefd) == -1) {
        perror("pipe");
        exit(1);
    }
    pid = fork();
    if (pid == 0) {
        // Child process
        close(pipefd[0]);  // Close the read end of the pipe in the child process
        shared_variable = 42;
        write(pipefd[1], &shared_variable, sizeof(int));
        close(pipefd[1]);
        exit(0);
    } else if (pid > 0) {
        // Parent process
        close(pipefd[1]);  // Close the write end of the pipe in the parent process
        read(pipefd[0], &shared_variable, sizeof(int));
        close(pipefd[0]);
        printf("Parent process: shared_variable = %d\n", shared_variable);
    } else {
        // Fork failed
        perror("fork");
        exit(1);
    }
    return 0;
}
  1. Очереди сообщений.
    Очереди сообщений позволяют обмениваться сообщениями между процессами. Вы можете создать очередь сообщений с помощью функции msgget()и отправлять/получать сообщения с помощью msgsnd()и msgrcv(). Вот пример:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
struct message {
    long mtype;
    int shared_variable;
};
int main() {
    int msqid;
    struct message msg;
    pid_t pid;
    msqid = msgget(IPC_PRIVATE, IPC_CREAT | 0666);
    if (msqid == -1) {
        perror("msgget");
        exit(1);
    }
    pid = fork();
    if (pid == 0) {
        // Child process
        msg.mtype = 1;
        msg.shared_variable = 42;
        msgsnd(msqid, &msg, sizeof(int), 0);
        exit(0);
    } else if (pid > 0) {
        // Parent process
        wait(NULL);
        msgrcv(msqid, &msg, sizeof(int), 1, 0);
        printf("Parent process: shared_variable = %d\n", msg.shared_variable);
    } else {
        // Fork failed
        perror("fork");
        exit(1);
    }
    msgctl(msqid, IPC_RMID, NULL);
    return 0;
}

Это всего лишь несколько примеров того, как можно совместно использовать переменные между процессами, созданными с помощью fork(). Другие методы включают использование сокетов, файлов или даже использование механизмов межпроцессного взаимодействия более высокого уровня, таких как каналы и сокеты, предоставляемые конкретными библиотеками.