IPC nima? Processlar orasidagi kommunikatsiya (pipe, socket)

Assalamu Alaykum bugun 2 ta process bir bilan qanday bog'lanib ma'lumot almashishi qanaqa bo'lishini ko'rib chiqamiz.

Maqolani yaxshiroq tushunish uchun ushbu maqolalarni oldindan o'qishingizni tavsiya qilaman.

  1. Process va thread nima farqi bor ?

  2. Unix qanday ishlaydi ?

IPC nima ?

IPC so'zining kengaytmasi Inter Process Communications ya’ni bir necha processlar bir biri bilan ma'lumot almashinishiga aytdiladi.

Stdin, Stderror va Stdout

Har bir process yaratilganda unga 3 ta turli standart streamlar ulangan bo'ladi va ular istalgan processga ulanish va undan ma'lumot olish yoki berishga yordami beradi. Masalan agarda terminal yaratasak input stream (stdin)klaviaturaga bog'langan output stream (stdout) esa monitordagi terminalga bog'langan bo'ladi . Bizda yana error streamham mavjud u stderrordeb ataladi va u errorlarni uzatish uchun alohida kanal hisoblanadi..

Biz bu streamlar orqali network carddan so'rovlar yuborishimiz yoki qabul qilishimiz mumkin , xotiradan fayllar o'qib va yozishimiz va boshqa ko'p narsalar qilishimiz mumkin. Bir processning chiquvchi streamni boshqa process ning kiruvchi streamiga bog'lasak bo'ladi, shunda ma'lumot processdan processga o'tib ketadi.

Quyidagi misolda nodejs processdagi ma'lumot terminal processga kelayotganini ko'rishimiz mumkin.

const { stdin, stderr, stdout } = require('node:process');

stdin.on('data', (data) => {
  console.log('Stdin', data.toString('utf8'));
});
stdout.write('This is some text I want ');
stderr.write("Hello I'm bug");

Bashda Pipe va redirection

process1 | process2 bu buyruq process1ning chiquvchi (stdout) streami process2ning kiruvchi (stdin) streamga bog'lansizn degani va bu piping deb ataladi . Bundan tashqari terminalda har bir streamlar uchun raqamlar berilgan 0 => stdin, 1 => stdout, 2 => stderr.

node index.js > text.txt bu orqali biz node processdan chiquvchi streamni text.txt faylga to'g'riladik va endi hamma ma'lumotlar o'sha yerga yoziladi , > orqali qilinganda u overwrite yani qaytadan yozadi agarda oxiriga qo'shmoqchi bo'lsak >> belgisidan foydalanishimiz mumkin. Bundan tashqari 0 < text.txt orqali kiruvchi ma'lumotlarni shu fayldan olishini ko'rsatishimiz mumkin. Bular shelldagi redirections ya'ni streamlarni qayta yo'naltirish deyiladi.

Unix domain sockets

Unix domain socket bu IPC kommunikatsiyaning boshqa yo'li u yana IPC socket deb ham ataladi. Bunda biz net moduldan foydalanamiz port o'rniga socketning pathini beramiz. Bu haqida biroz ushbu maqolada ham ma'lumot berilgan. Stream orqali chat app quramiz.

Quyida Nodejs va C++ dasturi processlarini aloqa qilish misol qilib ko'rsatilgan.

const net = require('net');
const socketPath = '/tmp/mysocket.sock';

const client = net.createConnection({ path: socketPath }, () => {
  console.log('Connected to server');
  client.write('Hello from Node.js client!');
});

client.on('data', (data) => {
  console.log('Received from server:', data.toString());
  client.end();
});

client.on('end', () => {
  console.log('Disconnected from server');
});

client.on('error', (err) => {
  console.error('Socket error:', err.message);
});
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <iostream>
#include <cstring>

#define SOCKET_PATH "/tmp/mysocket.sock"

int main() {
    int server_fd, client_fd;
    struct sockaddr_un address;

    // Remove any previous socket file
    unlink(SOCKET_PATH);

    server_fd = socket(AF_UNIX, SOCK_STREAM, 0);
    if (server_fd == -1) {
        perror("socket");
        return 1;
    }

    memset(&address, 0, sizeof(struct sockaddr_un));
    address.sun_family = AF_UNIX;
    strncpy(address.sun_path, SOCKET_PATH, sizeof(address.sun_path) - 1);

    if (bind(server_fd, (struct sockaddr*)&address, sizeof(struct sockaddr_un)) == -1) {
        perror("bind");
        return 1;
    }

    if (listen(server_fd, 5) == -1) {
        perror("listen");
        return 1;
    }

    std::cout << "Server is listening on " << SOCKET_PATH << std::endl;

    client_fd = accept(server_fd, NULL, NULL);
    if (client_fd == -1) {
        perror("accept");
        return 1;
    }

    char buffer[256];
    int bytes = read(client_fd, buffer, sizeof(buffer) - 1);
    if (bytes > 0) {
        buffer[bytes] = '\0';
        std::cout << "Received from client: " << buffer << std::endl;
    }

    const char *reply = "Hello from C++ server!";
    write(client_fd, reply, strlen(reply));

    close(client_fd);
    close(server_fd);
    unlink(SOCKET_PATH);
    return 0;
}

Bu yerda C++ kodi g++ compiler(g++ compiler o'zingiz o'rnatishingiz kerak) orqali bytecodega o'tkazilgan unix execution fayl bo'lgan va uni ishga tushurish orqali biz c++da yozilgan kodlarimizni ishga tushura olamiz.

Bu yerda berilgan pathga biz ma'lumot yozib uni keyin o'qimayapmiz (bu juda sekin bo'lardi) unixda hamma narsa fayl hisoblanadi bu socketga ham ta'luqli ,fayl buni shunchaki processlar orasidagi eshik deb qarasak bo'ladi.

Ko'rib turganingizdek bir xil ish Nodejs va C++ orqali qilinganda turli xil harakat talab qiladi (c++da ancha ko'p) shuning uchun networking dasturlar uchun Nodejs ishlatilinadi.

Hamma kodlarni buyerdan topishingiz mumkin. Repo

IPC va networking farqi

IPC kommunikatsiya bir kompyuterdagi 2 process o'rtasida ishlatilinadi. Networkingdagi TCP va UDP orqali ham processlarni port orqali bog'lasak bo'ladiku deyishingiz mumkin, lekin ular tarmoqdagi har xil kompyuterlarni bir biriga bog'lash uchun chiqarilgan .Bundan tashqari IPC to'g'ridan to'g'ri xotiradan foydalanadi va tezroq ishlaydi. 2ta process bog'lanishuni bir misolda ko'raylik port orqali kelganda ma'lumot network cardga boradi va u orqali 2-processga yetib keladi, IPCda ikkala process uchun RAMdan joy ajratilgan bo'ladi va ma'lumot shunchaki bir joydan boshqasiga olib o'tiladi. Hamma o'zgarishlar RAMda bo'ladi.

Xulosa

Xulosa qilib aytadigan bo'lsak IPC juda kuchli tool hisoblanadi chunki biz internetga bog'lanishlarni osongina nodejsda qilib C++ga qiyin vazifalarni o'tkazgan holda IPC bilan ishlashimiz mumkin bu fayli o'zgartiruvchi dastur yoki video editor bo'lishi ham mumkin (fantaziyangizga bog'liq).

video editor
video editor

Agarda maqola yoqqan bo'lsa chapak chaling (ko'p chalsayam bo'ladi :). Obuna bo'lishni unutmang ;)

Xato va kamchiliklar uchun uzr !!!

linkedin.com => Ulug’bek Habibov | LinkedIn

telegram channel =>@habibov_ulugbek