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

Rispondere a