Как связать данные двух отдельных программы в одну?

Не знаю возможно ли это сделать или нет, поэтому и спрашиваю.

У меня есть две программы

main.cpp

// инициализация массива только тут!
int numbers[4] = {1,2,3,4};

int main()
{

std::cout << numbers[3] << std::endl;

return 0;
};

и вторая программа у которой нету инициализации массива, но я бы хотел его вызвать

main2.cpp
// сейчас эта программа не знает не про какой массив numbers
int main()
{

std::cout << numbers[3] << std::endl;

return 0;
};

Я запускаю вначале программу main.cpp и потом могу запустить программу main2.cpp Мне интересно могу ли я получить данные с первой программы, и подключить их к другой программе.

Это нужно сделать максимально быстро, что бы программа под номером main2.cpp считывала и использовала данные как будто это ее часть.

Любы идеи или вопросы если не понятно.


Ответы (2 шт):

Автор решения: Harry

Так, как вы написали -

// сейчас эта программа не знает не про какой массив numbers

нет. Вы просто обязаны объявить в программе все используемые переменные. Какой бы механизм передачи данных вы не использовали - место, куда эти данные будут помещаться, должно быть объявлено и создано.

Далее, из вашего

Я запускаю вначале программу main.cpp и потом могу запустить программу main2.cpp

следует, что вы планируете запускать их раздельно, т.е. между завершением первой и началом второй должно пройти время. В таком случае у вас есть единственный вариант - сохранение первой программой данных на некотором носителе (в файле), с тем, чтобы вторая программа считывала их.

Более (а как по мне - самый) простой вариант был бы, если ваши программы запустить одновременно и вывод первой подать на вход второй, командной строкой с применением | - типа,

main1.exe | main2.exe

Тогда все, выводимое первой программой в cout, шло вы второй в cin, так что если бы ваша первая программа оставалась той же, а вторая имела вид

int main()
{
    int numbers[4];
    std::cin >> numbers[3];
    std::cout << numbers[3] << std::endl;
};

то она бы прочла число, выведенное первой программой (на экран от первой программы оно бы при этом не шло) и вывела на экран его сама.

→ Ссылка
Автор решения: DSuhoi

Для передачи данных между программами на ЭВМ можно использовать UNIX-сокеты. Для использования подобного интерфейса передачи данных потребуются всего 3 библиотеки из языка Си: sys/socket.h, sys/types.h и sys/un.h.

Серверная часть:

//main2.c

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>

#define LEN_ARR 16

int main()
{
    int sock;
    struct sockaddr_un addr;    //стуктура с адресом 
    int *numbers = (int*) malloc(sizeof(int)*LEN_ARR);  //массив для чтения данных
    int bytes_read; //количество считанных данных

    if((sock = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) //создание локального сокета
    {
        perror("socket");
        exit(1);
    }

    addr.sun_family = AF_UNIX;  //домен

    strcpy(addr.sun_path, "mysocket");  //копирование названия файла сокета

    if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)  //
    {
        perror("bind");
        exit(2);
    }


    bytes_read = recvfrom(sock, numbers, LEN_ARR, 0, 0, NULL);  //т.к. принимаем 1 пакет данных, то используем recvfrom

    for(int i = 0; i< bytes_read; i++)
        printf("%d ", numbers[i]);  //выводим результат передачи
    printf("\n");

    close(sock);    //прерываем передачу

    system("rm mysocket");  //удаление файла сокета

    free(numbers);  //освобождаем память

    return 0;
}

Клиентская часть:

//main.c

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>


int main()
{
    int sock;
    struct sockaddr_un addr;

    int numbers[] = {1,2,3,4};  //массив для отправки

    if((sock = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) //создание сокета
    {
        perror("socket");
        exit(1);
    }

    addr.sun_family = AF_UNIX;  //домен
    strcpy(addr.sun_path, "mysocket");  //файл сокета

    sendto(sock, numbers, sizeof(numbers), 0,
           (struct sockaddr *)&addr, sizeof(addr)); //отправляем 1 пакет данных (массив)

    close(sock);

    return 0;
}
→ Ссылка