为什么阻止接收工作和非阻塞不会

时间:2016-02-02 18:49:13

标签: c unix ipc message message-queue

我正在编写阻塞和非阻塞接收的示例。

我使用带有IPC_NOWAIT标志的msgrcv作为非阻塞接收

msgscv将0标志作为阻止接收。

然后我从另一个进程发送了一些消息。

如果我尝试仅使用阻止接收,则他们会正确接收消息。

我还尝试将非阻塞接收放在一个while循环中(它们应该工作直到终止消息到达)。但许多非阻塞接收不起作用。似乎只有等待终止消息的非阻塞接收才有效。

显然,我只发布了非工作代码。

接收程序:

while(terminato == 0)
{msgrcv(id_interfaccia,&msg,dim,NOTIFICA_AVVIO_CONTROLLORE,IPC_NOWAIT);
if(errno==0)
{printf("Controllore avviato\n");
}
msgrcv(id_interfaccia,&msg,dim,NOTIFICA_AVVIO_MIXER,IPC_NOWAIT);
if(errno==0)
{printf("Mixer avviato\n");
}


msgrcv(id_interfaccia,&msg,dim,NOTIFICA_INTERRUZIONE_MIXER,IPC_NOWAIT);
if(errno==0)
{   printf("Il controllore ha inviato il messaggio di interruzione al mixer\n");
}
msgrcv(id_interfaccia,&msg,dim,NOTIFICA_INTERRUZIONE_TERMOSTATO,IPC_NOWAIT);
{printf("Il controllore ha inviato il messaggio di interruzione al termostato\n");
}
    msgrcv(id_interfaccia,&msg,dim,NOTIFICA_AVVIO_TERMOSTATO,IPC_NOWAIT);
{printf("Il controllore ha inviato il messaggio di avvio al termostato\n");
}

msgrcv(id_interfaccia,&msg,dim,NOTIFICA_TERMINAZIONE_MIXER,IPC_NOWAIT);
if(errno==0)
{   printf("Il controllore ha inviato il messaggio di terminazione al mixer\n");
}
    msgrcv(id_interfaccia,&msg,dim,NOTIFICA_TERMINAZIONE_TERMOSTATO,IPC_NOWAIT);
if(errno==0)
{   printf("Il controllore ha inviato il messaggio di terminazione al termostato\n");
}

msgrcv(id_interfaccia,&msg,dim,TEMP,IPC_NOWAIT);
if(errno==0)
{printf("INTERFACCIA Aggiornamento temperatura:%d\n",msg.contenuto);
}
msgrcv(id_interfaccia,&msg,dim,TERMINA,IPC_NOWAIT);
if(errno==0);
{printf("INTERFACCIA Messaggio di terminazione\n");     
terminato = 1;
}
}

发送程序

 invia(id_interfaccia,NOTIFICA_AVVIO_CONTROLLORE,&msg);
  invia(id_mixer,AVVIA,&msg);
 invia(id_interfaccia,NOTIFICA_AVVIO_MIXER,&msg);
 sleep(3);
 invia(id_mixer,INTERROMPI,&msg);
 invia(id_interfaccia,NOTIFICA_INTERRUZIONE_MIXER,&msg);
 invia(id_termostato,AVVIA,&msg);
 printf("Il controllore ha inviato il messaggio di avviamento al           termostato\n");

 while(check<50)
{
msgrcv(id_controllore,&msg,dim,TEMP,0);
check = msg.contenuto;
msg.tipo = TEMP;
msg.contenuto = check;
msgsnd(id_interfaccia,&msg,dim,0);
}
 invia(id_termostato,INTERROMPI,&msg);
 invia(id_interfaccia,NOTIFICA_INTERRUZIONE_TERMOSTATO,&msg);
 invia(id_mixer,TERMINA,&msg);
 invia(id_interfaccia,NOTIFICA_TERMINAZIONE_MIXER,&msg);
  invia(id_termostato,TERMINA,&msg);

Invia和ricevi功能:

void invia(int dest,int tipo,messaggio* pointer)
{pointer->tipo = tipo;
msgsnd(dest,pointer,dim,0);
}
void ricevi (int dest,int tipo,messaggio* pointer)
{msgrcv(dest,pointer,dim,tipo,0);
}

type struct Message有type(tipo)和content(contenuto)字段。

0 个答案:

没有答案