Spuštění jiného programu z C

Spuštění jiného programu z C
« kdy: 19. 04. 2011, 17:20:37 »
Zdravím, mám menší problém s klasickým C:
Mám 2 programy - grafické rozhraní a výkonnou část, z grafické části potřebuji spustit výkonnou část tak, aby grafické rozhraní nebylo pozastaveno (funkce system), nebo zrušeno (exec*). Nic pořádného jsem nevygooglil. Jedniná fce, kterou sem našel ,a která volající program neukončí je popen na vytvoření roury, ale kůli tomu, že programy mají být multiplatformní ji nemůžu použít (pod wokna ju nedostanu).

Proto se táži Vás, nevíte o něčem, co by šlo použít?
« Poslední změna: 19. 04. 2011, 21:01:19 od Petr Krčmář »


martin

Re: Spuštění programu
« Odpověď #1 kdy: 19. 04. 2011, 17:43:46 »
fork(2) + exec(3) příp. execve(2)

Na win existují ekvivalenty

Re: Spuštění jiného programu z C
« Odpověď #2 kdy: 20. 04. 2011, 06:28:01 »
Napadlo mě ještě jiné řešení - vytvořil jsem si vlákno a tam to spustil funkcí system. Vypadá to, že tohle řešení je ideální.

martin

Re: Spuštění jiného programu z C
« Odpověď #3 kdy: 20. 04. 2011, 08:13:25 »
Napadlo mě ještě jiné řešení - vytvořil jsem si vlákno a tam to spustil funkcí system. Vypadá to, že tohle řešení je ideální.

To má k ideálnímu řešení hodně daleko.

Re: Spuštění jiného programu z C
« Odpověď #4 kdy: 20. 04. 2011, 09:55:15 »
V linuxu fork a ve vytvorenem diteti exec. Tam kde funguje vfork tak pouzit ten, protoze fork muze selhat pokud aplikace ma zaalokovano vic nez polovinu volne pameti * povoleny overcommit.

Ve windows CreateProcess a nezapomenout pozavirat vsechna vytvorena HANDLE.

Pokud chcete sledovat zda proces bezi, pak v linuxu nejaka varianta funkce wait(), ve Windows funkce WaitForSingleObject pro jeden z vytvorenych HANDLE, ktere si samozrejme zavrete az po tom, co proces skonci.


Logik

  • *****
  • 1 022
    • Zobrazit profil
    • E-mail
Re: Spuštění jiného programu z C
« Odpověď #5 kdy: 20. 04. 2011, 15:49:53 »
No, vzhledem k tomu, že to řeší spousta lidí, tak bych neřešil kolo, ale použil některou z "osvědčených knihoven".
http://stackoverflow.com/questions/3019081/portable-c-library-for-ipc-processes-and-shared-memory-boost-vs-ace-vs-poco

Druhá možnost, co mě napadá, tak se vykašlat na spouštění procesů, výkonnou část zkompilovat jako commandline exáč + knihovnu a fce tý knihovny spouštět místo v spešl procesu jen v threadu.

Psaní vlastního multiplatformního exec bych viděl jako poslední možnost, protože to bude nejméně portabilní možnost, zatímco s již hotovou knihovnou vím, že to bue běhat všude.

martin

Re: Spuštění jiného programu z C
« Odpověď #6 kdy: 20. 04. 2011, 16:33:38 »
No, vzhledem k tomu, že to řeší spousta lidí, tak bych neřešil kolo, ale použil některou z "osvědčených knihoven".
http://stackoverflow.com/questions/3019081/portable-c-library-for-ipc-processes-and-shared-memory-boost-vs-ace-vs-poco

Druhá možnost, co mě napadá, tak se vykašlat na spouštění procesů, výkonnou část zkompilovat jako commandline exáč + knihovnu a fce tý knihovny spouštět místo v spešl procesu jen v threadu.

Psaní vlastního multiplatformního exec bych viděl jako poslední možnost, protože to bude nejméně portabilní možnost, zatímco s již hotovou knihovnou vím, že to bue běhat všude.

Mně tedy přijde dost zvrhlé zanášet aplikaci knihovnou(ama) a tudíž závislostma (neřku-li jejíma chybama), když jde zrovna tohle nahradit jedním if-em.

Logik

  • *****
  • 1 022
    • Zobrazit profil
    • E-mail
Re: Spuštění jiného programu z C
« Odpověď #7 kdy: 20. 04. 2011, 17:16:12 »
O jakejch knihovnách mluvíš? Jestli o knihovnách zdrojovýho kódu, tak tam prostě přibalíš ke zdrojákům jejich současnou implementaci a máš to. Takovýdle jednoduchý fce tam jsou 100pro bez bugů. Navíc máš zajištěno, že pokud se v rozhraní OS něco změní, tak na to knihovna bude reagovat - nebudeš muset studovat, co se změnilo, prostě vezmeš novou verzi knihovny. A máš implementaci pro daleko větší škálu systémů. Jak ukazuje Ondra, on to ani pro Win/Lin není jen jeden if.
Kompilovat to můžeš staticky, takže žádné řešení závislostí nehrozí.

Nebo myslíš udělat to za pomocí dynamické knihovny? Není jedno, jestli to závisí na exáči, nebo na knihovně?

martin

Re: Spuštění jiného programu z C
« Odpověď #8 kdy: 20. 04. 2011, 17:26:13 »
Bavíme se o spouštění binárky na pozadí. Mám asi malou fantazii, ale opravdu mě nenapadá, proč by se měla funkce fork(2), execve(2) a CreateProcess v jiné verzi OS měnit. Desítky let je to stejné.

A pokud není programátor schopen tahle 3 volání zkombinovat do jednoho ifdefu, tak by měl spíš použít nějaký python, ruby, tcl/tk apod. a obloukem se Cčku vyhnout.

eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re: Spuštění jiného programu z C
« Odpověď #9 kdy: 20. 04. 2011, 17:42:37 »
A není lepší tu "výkonovou" část udělat jako knihovnu? Pak není třeba se štvát s nějakým execem.

Logik

  • *****
  • 1 022
    • Zobrazit profil
    • E-mail
Re: Spuštění jiného programu z C
« Odpověď #10 kdy: 20. 04. 2011, 17:46:19 »
Jo, to jsem taky navrhoval a přijde mi to jako nejlepší řešení. Akorát furt zůstavá problém v podobě multiplatformního vytváření threadů - to je ale jednodušší a na to existuje spousta jednoúčelovejch hotovejch kódů.

martin

Re: Spuštění jiného programu z C
« Odpověď #11 kdy: 20. 04. 2011, 18:11:19 »
Jak s binárky udělám knihovnu?

Logik

  • *****
  • 1 022
    • Zobrazit profil
    • E-mail
Re: Spuštění jiného programu z C
« Odpověď #12 kdy: 20. 04. 2011, 19:12:02 »
Jednoduše, funkcím, který chceš volat zvenku dáš modifikátor
Kód: [Vybrat]
extern "C"
a přeložíš to s přepínačema
-shared -fPIC
(gcc, u jinejch překladačů to najdeš v dokumentaci)

Funkce pak spouštíš buďto dynamickym nahrátím knihovny (složitější), nebo knihovnu normálně přilinkuješ a napíšeš k ní hlavičkový soubory...

martin

Re: Spuštění jiného programu z C
« Odpověď #13 kdy: 20. 04. 2011, 19:53:13 »
Jednoduše, funkcím, který chceš volat zvenku dáš modifikátor

jaké funkce u binárky? jaké překládání? biggles001 psal, že pouští výkonnou část přes system(3) tj. má binárku. Nepsal, že má zdrojový kód. Dotaz, myslím, zněl jasně. Kdyby měl zdrojové kódy, tak mě nenapadá (za daných okolností) proč by to takto rozděloval na 2 části. IMO je to typický případ, kdy má někdo binární "výkonnou" část pro 2 platformy bez dostupnosti zdrojáků a dělá si k nim GUI.

Logik

  • *****
  • 1 022
    • Zobrazit profil
    • E-mail
Re: Spuštění jiného programu z C
« Odpověď #14 kdy: 20. 04. 2011, 21:56:16 »
martin: Co kdybys nechal mluvit samotného tazatele? Ono zaprve mít takto oddělené binárky a gui frontend v samostatných exáčích je na linuxu vcelku běžný postup, takže bych se nedivil, ani kdyby ta binárka byla také jeho práce - a za druhé pokud to je multiplatformní aplikace, tak zpravidla bývá se zdrojovými kódy.

btw. Co se týče toho měnění, tak jak vidíš, standard se mění. Např ono vfork, které bylo do standardu přidáno relativně nedávno. Backward compatibility sice v drtivé většině zachovávaná je, ale "novější" řešení je většinou z nějakých důvodů lepší (viz např. fork/vfork).