Olen ohjelmoinut nyt kaksi erillistä ohjelmaa toisen javalla ja toisen c++ kielellä. Mikä on tehokkain tapa siirtää muuttujien arvoja kahden rinnan suoritettavan ohjelman välillä? saan ne siirtymään tiedoston kautta mutta se ei liene kovin optimaalista.
Mikäli käytät Windowsia voit käyttää sen "viestejä", muutoin esim TCP tai UDP tyyppiset soketit jotka ei ole rajoittuneita pakettien koon suhteen kuten nuo windowsin ...
vastaava löytynee mac os x:n ja xcoden käyttäjälle
Suosittelen joko mainittuja socketteja tai putkia (pipe, FIFO). Jälkimmäisiä käytetään yleensä (eli muualla kuin Windowsissa) samalla tavalla kuin tiedostoja, mutta data ei käy oikeasti levyllä vaan kiertää vain muistipuskurin kautta. Putket ovat (luultavasti) socketteja tehokkaampia, joskin ero lienee joka tapauksessa marginaalinen.
Itse en Macia käytä tahi omista, mutta käsittääkseni Mac OS X on jossain määrin UNIX- ja POSIX-yhteensopiva käyttöjärjestelmä, joten tutkipa, löytyykö tällaista funktiota, josta Linuxin man-sivut kertoivat:
#include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode);
// Toinen ohjelma (luultavasti C++-ohjelma) luo putket, yhden molempiin suuntiin mkfifo("/tmp/a-to-b", 0777); mkfifo("/tmp/b-to-a", 0777); // Nyt voi toisen avata tulostusta ja toisen lukemista varten, toisessa ohjelmassa toki toisin päin. std::ifstream tulo("/tmp/b-to-a"); std::ofstream meno("/tmp/a-to-b"); meno << "Iltaa." << std::endl; tulo >> vastaus; std::cout << vastaus << std::endl; // "_Hyvää_ iltaa." ;)
javaa en osaa, joten en tiedä varmaksi onnistuuko jaetun muistin käyttö. C:ssä jaettu muisti olisi luultavasti se tehokkain keino. Itse valitsisin kuitenkin socketit. Unix socketit kun ovat varsin nopeita, ja mikäli käytät normaaleja ethernetin yli toimivia socketteja, voit tarvittaessa siirtää toisen ohjelman pyörimään vaikka eri tietokoneelle. Toki ethernetin yli toimivat socketit ovat hieman hitaampia.
maz kirjoitti:
Unix socketit kun ovat varsin nopeita, ja mikäli käytät normaaleja ethernetin yli toimivia socketteja
Kai noi AF_INET socketitkin toimii paikallisestikin ja vaikka Token Ringissä, eikä vain ethernetin yli? Vai tarkoititko jotain ihan muuta kuin AF_INET -tyyppisiä socketteja?
Aihe on jo aika vanha, joten et voi enää vastata siihen.