Trimiteți mesaje pentru a programa prin linia de comandă

Am acest program, îl vom numi gazdă. Gazdă face tot felul de lucruri bune, dar trebuie să poată accepta intrarea prin linia de comandă în timp ce rulează . Aceasta înseamnă că trebuie să trimită oarecare date despre celelalte procese și apoi să renunțe. De exemplu, trebuie să pot face acest lucru:

./Host --blahblah 3 6 3 5

Acest lucru ar trebui să ajungă într-un fel să numească o anumită funcție în Host called

handleBlahBlah(int x1, int y1, int x2, int y2){
  //do some more sweet stuff
}

Gazdă este un program C și nu are nevoie de suport pentru mai multe instanțe.

Un exemplu este muzica Amarok. Cu Amarok care rulează și se joacă, puteți scrie "amarok - pause" și va întrerupe muzica.

Trebuie să fie în măsură să facă acest lucru în Linux sau Windows. De preferință Linux.

Care este cel mai curat mod de a implementa acest lucru?

0
fr hi bn
Doriți să-i transmiteți argumente atunci când programul este deja rulat? Pentru ce sistem de operare este programat?
adăugat autor Adam Haile, sursa

6 răspunsuri

Dacă v-ați afla pe Windows, v-aș spune să utilizați o fereastră ascunsă pentru a primi mesajele, dar din moment ce ați folosit ./ , presupun că vreți ceva bazat pe Unix.

În acest caz, aș merge cu o pipe numită . Sun are un tutorial despre conductele numite care ar putea fi utile.

Programul ar crea probabil conducta și să asculte. S-ar putea să aveți un script separat de linie de comandă, care să deschidă țeavă și să-i ecouze argumentele liniei de comandă.

ar putea modifica programul dvs. pentru a accepta trimiterea liniei de comandă în loc să utilizeze un script separat. În acel caz, ați face același lucru de bază. Programul dvs. ar arăta argumentele liniei de comandă și, dacă este cazul, deschideți conducta la instanța "principală" a programului și trimiteți argumentele.

0
adăugat
+1 Am folosit această metodologie numită de câteva ori și funcționează destul de bine. De asemenea, am folosit socket-uri UNIX pentru cazurile în care programul principal a fost necesar pentru a returna datele în scriptul/programul de comandă.
adăugat autor jschmier, sursa

Așadar, poate că am lipsit punctul aici, dar prin deficiența unei funcții principale a programului C durează două argumente; argc, un număr de argumente (cel puțin unul) și argv (sau arg vector), lista de argumente. Puteai doar să analizezi argumentele și să apelezi la metoda corectă. De exemplu:

 int main(int argc, *argv[])
 {
     /*loop through each argument and take action*/
      while (--argc > 0)
      {
           printf(%s%s, *++argv, (argc > 1) ? " " : "");
      }
 } 

ar imprima toate argumentele pe ecran. Eu nu sunt un C guru, așa că sper că nu am făcut nici o greșeală.

EDIT: Bine, a fost după altceva, dar nu a fost foarte clar înainte ca întrebarea să fie redactată. Nu trebuie să sari pe rep ...

0
adăugat

O tehnică pe care am văzut-o este ca programul dvs. Host să fie doar o "coajă" pentru programul dvs. real. De exemplu, atunci când lansați aplicația în mod normal (de exemplu: ./ Host} ), programul va intra în partea principală a codului. Atunci când lansați programul într-un mod care sugerează că doriți să semnați instanța care rulează (de exemplu: ./ Restart gazdă -send-message ), programul va introduce în partea de expeditor a mesajului Codul tau. Este ca și cum ai avea două aplicații într-una. O altă opțiune care nu utilizează fork este să facă Host o aplicație purtătoare de mesaje și să aibă aplicația principală ca executabil separat (de exemplu: Host_core ) care poate fi lansat separat Host .

Partea principală a aplicației va trebui să deschidă un fel de canal de comunicare pentru a primi mesaje, iar partea "expeditorului mesajului" va trebui să se conecteze la acel canal și să o folosească pentru a trimite mesaje. Există mai multe opțiuni diferite pentru trimiterea mesajelor între procese. Unele dintre metodele mai frecvente sunt conducte și prize . În funcție de sistemul dvs. de operare, este posibil să aveți opțiuni suplimentare disponibile; de exemplu, QNX are canale și BeOS/Haiku au BMessages . De asemenea, puteți găsi o bibliotecă care înglobează cu atenție această funcție, cum ar fi lcm .

0
adăugat

Vă sugerăm să utilizați un soclu Unix sau D-Bus . Utilizarea unui soclu ar putea fi mai rapid dacă sunteți familiarizat cu programarea socketurilor Unix și doriți doar câteva operații, în timp ce D-Bus ar putea facilita concentrarea pe implementarea funcționalității într-un mod obișnuit de orientare obiect.

Uitați-vă la Ghidul lui Beej pentru IPC-ul Unix , în special la capitol despre prize Unix .

0
adăugat

Dacă trebuie să fie încrucișată, ar trebui să vă gândiți să faceți ascultarea instanței care rulează pe un port TCP și să aveți instanța pe care o declanșați din linia de comandă să trimiteți un mesaj portului respectiv.

0
adăugat

Ceea ce a spus nimeni aici nu este acesta: "nu poți ajunge de aici".

Linia de comandă este disponibilă numai ca atunci când programul dvs. a fost invocat.

Exemplul invocării argumentelor fillinthename ... pentru a comunica cu fillinthename o dată ce fillinthename este difuzat poate fi realizat numai prin utilizarea a două instanțe ale program care comunică între ele.

Celelalte răspunsuri sugerează modalități de realizare a comunicării.

Un program ca amarok trebuie să detecteze existența unei alte instanțe de la sine, pentru a ști ce rol trebuie să joace, rolul major al persistent mesaj receptor/server, sau rolul minor de o singură lovitură mesaj expeditor.

editat pentru a face cuvântul fillinthename să fie afișat.

0
adăugat