Salve a tutti! Sto realizzando un programmino stile guardia e ladri per
un progetto universitario, però ho dei problemi, più che sulla
comunicazione, sulla combinazione fra "ncurses" e SysV.
Sto utilizzando una coda di messaggi per la comunicazione fra due processi,
riporto i due prototipi
int msgsnd(int msid, struct msgbuf *msgp, size_t msgsz, int msgflg);
int msgrcv(int msid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int
msgflg);
Il primo processo è quello che esegue funzioni ncurses e disegna su schermo, ed
è anche il mio "consumatore" di messaggi.
Il secondo è un semplice "produttore".
Ciò che mi lascia perplesso è che se non utilizzo funzioni Ncurses e uso
semplici printf() per la visualizzazione a video, non ho alcun problema.
Al
contrario quando utilizzo le funzioni ncurses sono costretto a
impostare nella "msgrcv" del consumatore il flag IPC_NOWAIT per poter
vedere funzionare la "refresh()", anche se nella coda ho inviato ad
esempio 3 messaggi il programma sembra aspettare indefinitamente.
In
più stampando a video utilizzando mvprintw(); non mi viene visualizzato
nulla, se non 0, come se non fosse arrivato nessun messaggio. Perché??
allego il codice per chi si sentirà di aiutarmi, grazie =)
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<curses.h>
#include<time.h>
#include<sys/types.h>
#include<sys/ipc.h>
void produci();
void consuma();
/** struttura Oggetto */
typedef struct object{
long mtype;
chtype type[3][3]; //tipo (pacman,ghost,punto,missile)
int x,y; //posizione
}object;
//control queue id
int ctl_quid;
int main(){
/** INIZIALIZZAZIONE CONTROL QUEUE */
ctl_quid = msgget(IPC_PRIVATE,IPC_CREAT|IPC_EXCL|0666);
/** INIZIALIZZAZIONE NCURSES */
initscr(); //inizializzazione schermo
noecho(); //non scrive i caratteri premuti sul terminale
cbreak(); //non attende l'invio
curs_set(0); //nasconde il cursore
start_color();
keypad(stdscr, TRUE); //avvia gli eventi da tastiera secondo la ncurses
pid_t process;
if(process = fork() == 0){
produci();
exit(1);
}else
consuma();
//uccido il figlio
kill(process,1);
//chiudo la coda
msgctl(ctl_quid,IPC_RMID,NULL);
//chiudo la ncurses
endwin();
return 0;
}
void produci(){
extern int ctl_quid;
object to_control;
to_control.type[0][0] = 'P';
to_control.x = 20;
to_control.y = 30;
//produce
while(1) msgsnd(ctl_quid,&to_control,sizeof(object)-sizeof(long),1);
}
void consuma(){
int i = 0;
extern int ctl_quid;
object valore_letto;
while(i<100)
{
msgrcv(ctl_quid,&valore_letto,sizeof(object)-sizeof(long),0,IPC_NOWAIT);
mvprintw(2,2,"x : %d",valore_letto.x);
mvprintw(2,2,"y : %d",valore_letto.y);
mvprintw(4,2,"i : %d",i);
refresh();
i++;
sleep(1);
}
}
_______________________________________________
Gulchelp mailing list
[email protected]
http://www.gulch.crs4.it/cgi-bin/mailman/listinfo/gulchelp