Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Programma in c da console

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

0
voti

[11] Re: Programma in c da console

Messaggioda Foto UtenteBerello » 19 dic 2010, 16:51

Daniele78 ha scritto:[...]
Utilizzando le code di messaggi si possono inviare quindi nuove informazioni al programma mentre è in esecuzione?

Si. ;-)
Qualsiasi programma può farlo usando le code di messaggi.

Però rispondimi anche a queste domande:
Berello ha scritto:Hai mai usato il comando man? Lo usi regolarmente e sai interpretare le sue pagine?


GNU/Linux rientra nei sistemi UNIX-like (detti anche *nix), quindi anche Ubuntu ne fa parte. Da quello che hai detto, immagino che non conosci molte librerie di sistema, ma non è importante.
Avatar utente
Foto UtenteBerello
110 1 3 7
Expert EY
Expert EY
 
Messaggi: 449
Iscritto il: 3 mar 2009, 23:53
Località: Roma

0
voti

[12] Re: Programma in c da console

Messaggioda Foto Utentexyz » 19 dic 2010, 18:01

Daniele78 ha scritto: Come sistema operativo uso maggiormente Ubuntu.

Ubuntu non è un sistema operativo ma una distribuzione di Linux la quale usa come sistema operativo GNU/Linux.

Per indicare la famiglia dei sistemi operativi Unix, come Linux, si è coniato il termine Posix visto che Unix è il sistema operativo sviluppato inizialmente dalla Bell Labs ora sotto il controllo della Novell.

Comunque hai le idee molto confuse e approssimative, ti consiglio di leggere tanto, molta documentazione si trova liberamente come "Advanced Linux Programming":

http://www.advancedlinuxprogramming.com/downloads.html

o anche il datato ma pur sempre valido "Advanced Programming in the UNIX Environment":

http://www.kohala.com/start/apue.html
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[13] Re: Programma in c da console

Messaggioda Foto UtenteDaniele78 » 21 dic 2010, 12:26

Berello ha scritto:Hai mai usato il comando man? Lo usi regolarmente e sai interpretare le sue pagine?


GNU/Linux rientra nei sistemi UNIX-like (detti anche *nix), quindi anche Ubuntu ne fa parte. Da quello che hai detto, immagino che non conosci molte librerie di sistema, ma non è importante.[/quote]

Molto raramente sopratutto se non ricordo qualche opzione. Evito, quando possibile, di lavorare da console.
Avatar utente
Foto UtenteDaniele78
290 2 9
Expert
Expert
 
Messaggi: 288
Iscritto il: 9 set 2008, 23:07

0
voti

[14] Re: Programma in c da console

Messaggioda Foto UtenteDaniele78 » 21 dic 2010, 12:29

xyz ha scritto:
Comunque hai le idee molto confuse e approssimative, ti consiglio di leggere tanto, molta documentazione si trova liberamente come "Advanced Linux Programming":

http://www.advancedlinuxprogramming.com/downloads.html

o anche il datato ma pur sempre valido "Advanced Programming in the UNIX Environment":

http://www.kohala.com/start/apue.html


Adesso vado a vedere.
Grazie!!!
Avatar utente
Foto UtenteDaniele78
290 2 9
Expert
Expert
 
Messaggi: 288
Iscritto il: 9 set 2008, 23:07

0
voti

[15] Re: Programma in c da console

Messaggioda Foto UtenteBerello » 21 dic 2010, 19:36

Beh, un programmatore C sotto GNU/linux non può fare a meno di man! ;-)
Impara a usarlo, perché ti servirà.

In questo caso dovresti vederti i dettagli delle chiamate di sistema che ti ho segnalato prima. Leggiti il man.
Codice: Seleziona tutto
man msgget

Se dopo non ti sarà chiaro, vedrò se riesco a farti un esempietto banale. ;-)

Le chiamate erano queste:
Berello ha scritto:msgget, msgctl, msgsnd, msgrcv.


Fammi sapere! ;-)
Avatar utente
Foto UtenteBerello
110 1 3 7
Expert EY
Expert EY
 
Messaggi: 449
Iscritto il: 3 mar 2009, 23:53
Località: Roma

0
voti

[16] Re: Programma in c da console

Messaggioda Foto UtenteBerello » 21 dic 2010, 22:19

Ho preparato il codice di esempio.
Te lo mando anche se non hai ancora risposto; nonostante ciò, ti consiglio vivamente di leggere comunque le pagine del comando man relative alle chiamate di sistema suddette. Fallo anche per capire meglio come funziona il codice di esempio, che riporto qui sotto.
Insisto nel dire che è fondamentale per un programmatore GNU/linux usare man in ogni momento ed è fondamentale saperlo usare. :ok:

Il codice è costituito da 3 files. Si tratta di due applicazioni: un server (applicazione) e un client (telecomando). Il terzo file è un header comune ai due programmi.
Per compilare, usa questi due comandi:
Codice: Seleziona tutto
gcc applicazione.c -o applicazione
gcc telecomando.c -o telecomando

Il codice è commentato, credo che non serva altro. In caso, chiedi.

comune.h
Codice: Seleziona tutto
#define CODICE_CODA 50 /* Questo codice identifica la coda: deve essere lo stesso
            su server e client. */

#define DIMENSIONE_MESSAGGIO 256 /* Dimensione del singolo messaggio, in caratteri */

typedef struct {
   long mtype;
   char s[DIMENSIONE_MESSAGGIO];
} messaggio;



applicazione.c
Codice: Seleziona tutto
#include<stdio.h>
/* Intestazioni per code di messaggi */
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/messaggio.h>
/* Intestazioni per exit() */
#include<stdlib.h>
/* Intestazioni per lavorare con le stringhe */
#include<string.h>
/* Intestazioni del programma */
#include"comune.h"


/* Variabile in cui memorizzare i messaggi ricevuti (la struttura viene creata
   nel file "comune.h" */
messaggio ricevuto;

int main(int argc, char **argv) {
   int coda, tmp;
   /* Prova a creare la coda */
   if ((coda = msgget(CODICE_CODA, IPC_CREAT|IPC_EXCL|0666)) == -1) {
      /* Se la coda non viene creata, potrebbe essere rimasta aperta
      da un uso precedente, ad esempio dopo un crash. Allora la apro
      e poi la cancello. */
      coda = msgget(CODICE_CODA, IPC_CREAT|0666);
      tmp = msgctl(coda, IPC_RMID, NULL);
      /* Prova nuovamente ad aprire la coda */
      if ((coda = msgget(CODICE_CODA, IPC_CREAT|IPC_EXCL|0666)) == -1) {
         /* Se fallisce, termina il programma con uno stato di errore */
         fprintf(stderr, "Errore nella creazione della coda\n");
         exit(-1);
      }
   }
   while (1) {
      /* Il programma si mette in attesa di messaggi sulla coda */
      if (msgrcv(coda, &ricevuto, sizeof(messaggio), 1, 0) == -1) {
         /* Se avviene un errore nella ricezione del messaggio, termina il programma con uno stato di errore */
         fprintf(stderr, "Errore nella ricezione di un messaggio\n");
         msgctl(coda, IPC_RMID, NULL);
         exit(-1);
      }
      /* Mostra il messaggio ricevuto sullo schermo */
      printf("%s\n", ricevuto.s);
      /* Se il messaggio ricevuto inizia con "fine" (ignorando
         la differenza tra maiuscole e minuscole) allora termina
         il programma */
      if (strncasecmp(ricevuto.s, "fine", 4) == 0) {
         break;
      }
   }
   /* Fine del programma: chiusura della coda di messaggi */
   printf("Rimozione della coda in corso... ");
   msgctl(coda, IPC_RMID, NULL);
   printf("Coda rimossa\n");
   return 0;
}



telecomando.c
Codice: Seleziona tutto
#include<stdio.h>
/* Intestazioni per code di messaggi */
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/messaggio.h>
/* Intestazioni per lavorare con le stringhe */
#include<string.h>
/* Intestazioni del programma */
#include"comune.h"

int main(int argc, char **argv) {
   int coda;
   messaggio comando;
   /* Se esistono dei parametri, il primo viene inviato al server;
      altrimenti viene dato un messaggio e il programma termina
      senza effettuare operazioni. */
   if (argc > 1) {
      /* Prepara la struttura del messaggio: il tipo è 1 */
      comando.mtype = 1;
      strncpy(comando.s, argv[1], DIMENSIONE_MESSAGGIO);
      comando.s[DIMENSIONE_MESSAGGIO - 1] = '\0';
      /* Apre la coda; se non ci riesce, restituisce un errore e termina il programma */
      if ((coda = msgget(CODICE_CODA, IPC_CREAT|0666)) == -1) {
         printf("\n");
         fprintf(stderr, "Errore nell'apertura della coda di messaggi del server\n");
         return -1;
      }
      /* Invia il messaggio sulla coda; se c'è un errore, termina il programma */
      if (msgsnd(coda, &comando, sizeof(messaggio), 0) == -1) {
         fprintf(stderr, "Errore nell'invio del messaggio\n");
         return -1;
      }
   } else {
      printf("Nessun parametro sulla riga di comando.\n");
   }
   return 0;
}



Fammi sapere! ;-)
Avatar utente
Foto UtenteBerello
110 1 3 7
Expert EY
Expert EY
 
Messaggi: 449
Iscritto il: 3 mar 2009, 23:53
Località: Roma

0
voti

[17] Re: Programma in c da console

Messaggioda Foto UtenteBerello » 22 gen 2011, 2:18

E' passato un mese e non c'è stata risposta... :(

Lo sapevo che non dovevo perderci tempo finché non era evidente che ci fosse interesse... :(
Dovevo davvero aspettare che venissero lette le voci del man che avevo segnalato.

Poi mi sentivo così avaro, conoscendo la soluzione ma non buttando giù un esempietto...
E alla fine c'ho perso tempo (e non poco, visto che ho dovuto rivedermi un po' di cosette prima di scrivere il codice), ma avrei fatto meglio a risparmiarlo. :-|

Ma perché mai continuare a discutere su un forum per un paio di giorni e poi, proprio quando la soluzione (preparata da qualcun altro) è finalmente pronta (non prima e nemmeno dopo averla provata), lasciar perdere? :?
Avatar utente
Foto UtenteBerello
110 1 3 7
Expert EY
Expert EY
 
Messaggi: 449
Iscritto il: 3 mar 2009, 23:53
Località: Roma

0
voti

[18] Re: Programma in c da console

Messaggioda Foto Utenteangus » 22 gen 2011, 2:37

sad but true O_/
in /dev/null no one can hear you scream
Avatar utente
Foto Utenteangus
8.480 4 6 9
G.Master EY
G.Master EY
 
Messaggi: 4171
Iscritto il: 20 giu 2008, 17:25

0
voti

[19] Re: Programma in c da console

Messaggioda Foto UtenteDarwinNE » 22 gen 2011, 14:58

Berello ha scritto:E alla fine c'ho perso tempo (e non poco, visto che ho dovuto rivedermi un po' di cosette prima di scrivere il codice), ma avrei fatto meglio a risparmiarlo. :-|


Però a me interessa... Sapevo che era possibile mettere a punto un sistema di scambio di messaggi, ma vedere un esempio funzionante è molto utile.
Follow me on Mastodon: @davbucci@mastodon.sdf.org
Avatar utente
Foto UtenteDarwinNE
31,0k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 4420
Iscritto il: 18 apr 2010, 9:32
Località: Grenoble - France

0
voti

[20] Re: Programma in c da console

Messaggioda Foto UtenteBerello » 22 gen 2011, 15:30

Mi fa piacere! :D

Se ho inviato quel messaggio non era tanto per fare polemica, ma anche per ricordare a Daniele che ha avuto la risposta: potrebbe non essersene accorto (a me alcune volte è capitato e solo successivamente l'ho notato) o magari si è solo scordato di dire "Ricevuto", perché magari non ha avuto il tempo di provare il codice... Son cose che capitano! :-)

D'altra parte, quando rispondo in un forum non lo faccio solo per gli altri, ma anche per me: per fare una ripassata, per mettermi alla prova (e farmi dire dagli altri "Hai sbagliato questo e quello!") e per imparare sempre qualcosa di nuovo... Quindi non mi sono sicuramente pentito di aver scritto quell'esempio! :mrgreen:
(anche se un pochino dispiace se il destinatario non riceve il messaggio)

A questo punto, visto che ci sono, faccio una precisazione: la "struct" che ho chiamato "messaggio" (nel file comune.h) nel mio caso contiene solamente 2 cose: un long (obbligatorio per le code di messaggi) e un vettore di caratteri. Se però servisse, la stessa struct potrebbe contenere anche dati aggiuntivi o diversi da un vettore di caratteri: se ad esempio il dato da trasferire fosse un intero, anziché inserire nella struct un vettore di caratteri, si può mettere una variabile int.
Insomma, a parte il "long mtype;" iniziale della struct, il resto può essere scelto arbitrariamente dal programmatore, come gli è più comodo. Va quindi trattata come una struct normale, con il solo vincolo di iniziare con un "long mtype" (obbligatorio per le code di messaggi).

Altra cosa che voglio segnalare è che il sistema operativo limita la memoria utilizzabile da un messaggio: questo è scritto nelle pagine del man e lì è spiegato come scoprire qual è la dimensione massima nel sistema operativo che si sta usando. Non ricordo se avevo già detto questo, comunque solitamente la dimensione è di circa 8 kB.

O_/
Avatar utente
Foto UtenteBerello
110 1 3 7
Expert EY
Expert EY
 
Messaggi: 449
Iscritto il: 3 mar 2009, 23:53
Località: Roma

PrecedenteProssimo

Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 17 ospiti