Как связать данные двух отдельных программы в одну?
Не знаю возможно ли это сделать или нет, поэтому и спрашиваю.
У меня есть две программы
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 шт):
Так, как вы написали -
// сейчас эта программа не знает не про какой массив 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;
};
то она бы прочла число, выведенное первой программой (на экран от первой программы оно бы при этом не шло) и вывела на экран его сама.
Для передачи данных между программами на ЭВМ можно использовать 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;
}