Autor Tema: Procesos linux. select y cola de mensajes  (Leído 4123 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado alexysar

  • PIC16
  • ***
  • Mensajes: 206
    • e-Kit
Procesos linux. select y cola de mensajes
« 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.
« Última modificación: 07 de Mayo de 2009, 19:10:19 por alexysar »

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Procesos linux. select y cola de mensajes
« Respuesta #1 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!!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado alexysar

  • PIC16
  • ***
  • Mensajes: 206
    • e-Kit
Re: Procesos linux. select y cola de mensajes
« Respuesta #2 en: 08 de Mayo de 2009, 02:22:46 »
 :shock:
« Última modificación: 05 de Junio de 2009, 21:44:37 por alexysar »

Desconectado alexysar

  • PIC16
  • ***
  • Mensajes: 206
    • e-Kit
Re: Procesos linux. select y cola de mensajes
« Respuesta #3 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.