TODOPIC

Lenguajes de programación para PC => C, C#, C++ => Mensaje iniciado por: alexysar en 07 de Mayo de 2009, 18:57:16

Título: Procesos linux. select y cola de mensajes
Publicado por: alexysar en 07 de Mayo de 2009, 18:57:16
Procesos linux. select y cola de mensajes
Hola Amigos.
declare una cola de mensajes asi:

key=ftok("../",'a');
qid=msget(key,IPC_CREATE|066);

msgget devuelve un int
pregunta ¿ ese int es un file descriptor? ¿ Lo puedo utilizar en el select?

Código: [Seleccionar]
if(socktcp>qid)  fdmax=socktcp;
           else fdmax=qid;

FD_ZERO(&serverst);
FD_SET(socktcp,&serverset);
FD_SET(qid,&serverset);

select(fdmax+1,&serverset,NULL,NULL,NULL);

¿el select se desbloquea cuando recibo un mensaje en la cola?

Lo pregunto porque encontre respuestas diferentes sobre el tema.
Título: Re: Procesos linux. select y cola de mensajes
Publicado por: gera en 08 de Mayo de 2009, 01:08:33
Cuando tengas este tipo de dudas, lo mejor es consultar al manual page de linux:
http://linux.die.net/man/2/msgget
:wink:
suerte!!!
Título: Re: Procesos linux. select y cola de mensajes
Publicado por: alexysar en 08 de Mayo de 2009, 02:22:46
 :shock:
Título: Re: Procesos linux. select y cola de mensajes
Publicado por: alexysar en 10 de Mayo de 2009, 12:25:17
El tema era que había leído que hay kernel que soportan la cola en el select y otros que no.
Bueno al final me hice el siguiente código para probar:

Código: [Seleccionar]
#include<stdio.h>
#include<stdlib.h>
#include<linux/ipc.h>
#include<linux/msg.h>

struct mymsbuf{
long mtype;
int numero_trabajo;
double salario;
}msg;


key_t GENERAR_CLAVE()
{
key_t msgkey;
msgkey=ftok(".",'a');
return(msgkey);
}

int ABRIR_COLA(key_t msgkey)
{
int qid;

if(qid=msgget(msgkey,IPC_CREAT|0666)<0){
perror("msgget");
exit(EXIT_FAILURE);
}
return(qid);
}

void REC_MENSAJE(int qid,struct mymsbuf *qbuf)
{
int longitud;

longitud=sizeof(struct mymsbuf)-sizeof(long);
if(msgrcv(qid,qbuf,longitud,0)<0){
perror("msgsend");
exit(EXIT_FAILURE);
}
return;


}

main()
{

int qid;
key_t msgkey;
fd_set set;


msgkey=GENERAR_CLAVE();
qid=ABRIR_COLA(msgkey);
/*preparo msj*/
FD_ZERO(&set);
FD_SET(qid,&set);
select(qid+1,&set,NULL,NULL,NULL);
REC_MENSAJE(qid,&msg);

 
}


y empecé a cargar mensajes en la cola, creada con una modificación del mismo programa. Me fijé si los mensajes se cargaron mediante:

Código: [Seleccionar]
alexis@Lubu:~/Documentos/Prog_mios$ ipcs -q

------ Colas de mensajes -----
key        msqid      propietario perms      bytes utilizados mensajes   
0x6106e841 0          alexis     666        36           3           

alexis@Lubu:~/Documentos/Prog_mios$


El asunto es que la consola en la que corría el proceso con el select no se desbloqueaba, por lo tanto concluyo que el int que devuelve msgget no es un file descripto, por lo menos en mi versión de Kernel.
Voy a tener que idear otra forma de programar mi servidor concurrente.