当前位置: 技术问答>linux和unix
select使用返回值,一个让我困惑的现象.
来源: 互联网 发布时间:2016-08-28
本文导语: 我用slect来判断linux的消息队列的可读情况,但发现slect老是返回=0(超时)而不是返回>0(有可读的文件描述符个数),不解中,有谁帮我理解下,谢谢: 截取代码片段说明: 1.创建消息队列代码: key = ftok(MSG_FILE,'m'); ...
我用slect来判断linux的消息队列的可读情况,但发现slect老是返回=0(超时)而不是返回>0(有可读的文件描述符个数),不解中,有谁帮我理解下,谢谢:
截取代码片段说明:
1.创建消息队列代码:
key = ftok(MSG_FILE,'m');
if(key == -1){ //如出错则返回-1
perror("ftok");
return 0;
}
printf( "key = %xn",key); //打印key
msgid=msgget(key, IPC_CREAT|0660); //创建消息队列,IPC_CREAT,0600是可读可写
if(msgid == -1){
perror("msgget");
return 0;
}
2.读取消息队列代码:
while(1)
{
timesend.tv_sec=1;
timesend.tv_usec=10*1000;
FD_ZERO(&rfds);
FD_SET(msgid,&rfds);
se_cnt = select (msgid + 1, &rfds, NULL, NULL, ×end);
printf("se_cnt = %d n",se_cnt);
// if(se_cnt > 0){ //加上这段就读取不了数据,不明白啊...
if(FD_ISSET(msgid,&rfds)){
if(msgrcv(msgid, &msg, sizeof(struct mymsg), 1, 0)== -1){
perror("msgrcv");
return 0;
}
printf("Server Receive:%sn", msg.senddat);
}
// }
FD_CLR (msgid, &rfds);
}
说明:
se_cnt 这个返回值,不会返回>0的值,在我现在注释掉那段,可以正常读取到数据,但是se_cnt=0这个不是超时的返回值吗????
为什么不会返回1呢???因为有可读信号不是返回可读的文件描述符个数吗?所以我认为是1,但不知道为什么会是0..
有谁帮我解惑下,谢谢...
截取代码片段说明:
1.创建消息队列代码:
key = ftok(MSG_FILE,'m');
if(key == -1){ //如出错则返回-1
perror("ftok");
return 0;
}
printf( "key = %xn",key); //打印key
msgid=msgget(key, IPC_CREAT|0660); //创建消息队列,IPC_CREAT,0600是可读可写
if(msgid == -1){
perror("msgget");
return 0;
}
2.读取消息队列代码:
while(1)
{
timesend.tv_sec=1;
timesend.tv_usec=10*1000;
FD_ZERO(&rfds);
FD_SET(msgid,&rfds);
se_cnt = select (msgid + 1, &rfds, NULL, NULL, ×end);
printf("se_cnt = %d n",se_cnt);
// if(se_cnt > 0){ //加上这段就读取不了数据,不明白啊...
if(FD_ISSET(msgid,&rfds)){
if(msgrcv(msgid, &msg, sizeof(struct mymsg), 1, 0)== -1){
perror("msgrcv");
return 0;
}
printf("Server Receive:%sn", msg.senddat);
}
// }
FD_CLR (msgid, &rfds);
}
说明:
se_cnt 这个返回值,不会返回>0的值,在我现在注释掉那段,可以正常读取到数据,但是se_cnt=0这个不是超时的返回值吗????
为什么不会返回1呢???因为有可读信号不是返回可读的文件描述符个数吗?所以我认为是1,但不知道为什么会是0..
有谁帮我解惑下,谢谢...
|
只要是描述符,select都支持
但是在消息队列id不是文件描述符。
但是在消息队列id不是文件描述符。