Torna indietro   Hardware Upgrade Forum > Software > Programmazione

ASUS ROG Kithara: quando HIFIMAN incontra il gaming con driver planari da 100mm
ASUS ROG Kithara: quando HIFIMAN incontra il gaming con driver planari da 100mm
ASUS e HIFIMAN uniscono le forze per creare ROG Kithara, cuffie gaming con driver magnetici planari da 100mm, design open-back e microfono MEMS full-band. Una proposta che ambisce a coniugare fedeltà per audiofili e performance ludiche, disponibili a 319 euro
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-01-2013, 08: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


ASUS ROG Kithara: quando HIFIMAN incontra il gaming con driver planari da 100mm ASUS ROG Kithara: quando HIFIMAN incontra il gam...
Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
World of Warcraft: Midnight debutta in a...
Scrapling, l'arma segreta di OpenClaw: 2...
iPhone 16e si abbassa ancora di prezzo: ...
Google Nano Banana 2: più veloce,...
Via libera della NATO a iPhone e iPad co...
Ennesimo cambio ai vertici di Intel Foun...
Anche Apple deve fare i conti con la cri...
Redmi Note 15 al miglior prezzo: la fasc...
Il mini supercomputer di NVIDIA costa di...
L'Unione Europea vuole estendere il Roam...
Galaxy S26, iPhone 17, robot e molto alt...
Oggi Samsung e Amazon mettono a disposiz...
C'è un coupon nascosto per rispar...
Crisi di DRAM e NAND: il mercato globale...
Burger King: un chatbot AI nei ristorant...
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: 12:28.


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