Answer-ID
  • Întrebări
  • Tag-uri
  • Categorii
Notificări
Recompense
Înregistrare
După înregistrare, veți primi notificări despre răspunsurile și comentariile la întrebările DVS.
Logare
Dacă aveţi deja un cont, autentificaţi-vă pentru a verifica notificările noi.
Aici vor fi recompensele pentru întrebările, răspunsurile și comentariile adăugate sau modificate.
Mai mult
Sursă
Editează
 andrewrk
andrewrk

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?

9 2008-08-13T22:40:57+00:00 6
Programare
command-line
c
architecture
io
Comentarii la întrebare (0)
Ed S.
14 august 2008 в 2:43
2008-08-14T02:43:34+00:00
Mai mult
Sursă
Editează
#10445

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
0
Comentarii (0)
Derek Park
14 august 2008 в 2:49
2008-08-14T02:49:13+00:00
Mai mult
Sursă
Editează
#10450

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
0
Comentarii (0)
Stu
14 august 2008 в 2:51
2008-08-14T02:51:30+00:00
Mai mult
Sursă
Editează
#10451

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
0
Comentarii (0)
Ted Percival
18 august 2008 в 12:55
2008-08-18T12:55:41+00:00
Mai mult
Sursă
Editează
#14352

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
0
Comentarii (0)
pbernatchez
7 iunie 2010 в 6:47
2010-06-07T18:47:50+00:00
Mai mult
Sursă
Editează
#2990496

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
0
Comentarii (0)
bta
11 august 2010 в 9:32
2010-08-11T21:32:45+00:00
Mai mult
Sursă
Editează
#3461155

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
0
Comentarii (0)
Adăugati o întrebare
Categorii
Toate
Tehnologii
Cultură
Viață / Artă
Stiință
Profesii
Afaceri
ID
KO
RU
© Answer-ID 2021
Sursă
stackoverflow.com
în cadrul licenței cc by-sa 3.0 cu atribuire