Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-01-2013, 07:58   #1
pasqualino10
Junior Member
 
Iscritto dal: Jul 2012
Messaggi: 1
code di messaggi IPC

Ho voluto provare a scrivere un programma banale, anzi due, per leggere e scrivere rispettivamente da una coda di messaggi ripetutamente.
IL problema è che non riesce a leggere dalla coda di messagi ma solo ad inviare e scrivere messaggi su di essa.
Posto qui i due programmi:
il primo legge dallo standard input e scrive e salva i valori sulla coda di messaggi, il secondo programma in pratica dovrebbe soltanto leggere i valori dalla coda di messaggi e stamparli su stdout.
Provate ad eseguirli e vedete se riuscite a capire il problema.

Codice:
/*devo realizzare una coda di messaggi IPC
attraverso la quale due programmi si scambiano
ripetutamente messaggi*/
/*Questo è quello che scrive sulla coda di 
messaggi i valori letti da tastiera(stdin)*/
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<errno.h>
struct msgbuf{
  long mtype;
  int value;
};
void send_on_queue(long v, int mq_id)
{
  /*invia la riga letta da linea di comando
   direttamente sulla coda di messaggi in
   modo che possa subito essere letta da qualcun altro*/
  struct msgbuf msg;
  msg.mtype = 1;
  msg.value = v;
  if(msgsnd(mq_id,&msg,sizeof(long),0) == -1){
    perror("in msgsnd");
    exit(EXIT_FAILURE);
  }
}
long read_value()
{
  errno = 0;
  long num;
  char buf[32];
  /*legge un'intera riga da terminale fino al 
   carattere newline tramite la fgets*/
    if(fgets(buf,32,stdin) == NULL){
      perror("in fgets");
      exit(EXIT_FAILURE);
    }
    char *end_ptr;
    num = strtol(buf,&end_ptr,10);
    /*if(errno != 0 || *end_ptr != '\0'){
      perror("in strtol");
      exit(EXIT_FAILURE);
    }
    */
    /*una volta che ho letto il valore posso
     inviarlo sulla coda di messaggi*/
    return num;
}
int open_queue_messages(void)
{
  key_t key;
  int qid;
  /*prima creiamo la chiave*/
  key = ftok(".",'a');
  if(key == -1){
    perror("in ftok");
    exit(EXIT_FAILURE);
  }
  /*ora devo aprire la coda di messaggi e ottenere
   l'identificatore per essa(un intero)*/
  qid = msgget(key,IPC_CREAT | 0666);
  if(qid == -1){
    perror("in msgget");
    exit(EXIT_FAILURE);
  }
  return qid;
}
int main(int argc, char *argv[])
{
  if(argc != 1){
    fprintf(stderr,"Usage only the argument : %s ",argv[0]);
    return EXIT_FAILURE;
  }
  /*ovviamente la coda di messaggi dovrà avere
   la stessa chiave anche nell'altro programma*/
  int q_id;/*identificatore coda di messaggi*/
  q_id = open_queue_messages();
  /*legge continuamente da standard input
   e continuamente scrive i valori sulla
   coda di messaggi(li invia con msgsnd)*/
  long val;
  for(;;){
    val = read_value();
    send_on_queue(val,q_id);
  }
  
return EXIT_SUCCESS;
}
Codice:
/*quest'altro programma ha il compito di
ricevere messaggi dalla coda di messaggi, i 
quali sono inviati dall'altro programma.*/
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<unistd.h>
struct msgbuf{
  long mtype;
  long value;
};
long read_from_queue(int id)
{
  struct msgbuf msg;
  if(msgrcv(id,&msg,sizeof(long),0,0) != sizeof(long)){
    perror("in msgrcv");
    exit(EXIT_FAILURE);
  }
  
return msg.value; /* ho ricevuto un messaggio */
}
int open_queue_messages(void)
{
  key_t key;
  int qid;
  /*prima creiamo la chiave*/
  key = ftok(".",'a');
  if(key == -1){
    perror("in ftok");
    exit(EXIT_FAILURE);
  }
  /*ora devo aprire la coda di messaggi e ottenere
   l'identificatore per essa(un intero)*/
  qid = msgget(key,IPC_CREAT | 0666);
  if(qid == -1){
    perror("in msgget");
    exit(EXIT_FAILURE);
  }
  return qid;
}
int main(int argc, char *argv[])
{
  if(argc != 1){
    fprintf(stderr,"Usage only argument : %s ",argv[0]);
    return EXIT_FAILURE;
  }
  int q_id;/*identificatore coda di messaggi*/
  q_id = open_queue_messages();
  long value;
  for(;;){
    value = read_from_queue(q_id);
    printf("Ho letto il numero %ld \n",value);

  }
return EXIT_SUCCESS;  
}
pasqualino10 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Dopo 23 anni di silenzio, Warcraft 3 spi...
Roblox sfida l'ecosistema gaming: app st...
OpenAI accusata di plagio dai migliori m...
Altro attacco hacker dell'IA: gli agenti...
Stiamo davvero perdendo il controllo del...
Microsoft perde un pilastro: Frank Shaw ...
Diablo V annunciato a sorpresa: il colpo...
Meno di 5 euro per il 5G: l'offerta Kena...
World of Warcraft: Forever è il Classic+...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 02:17.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v