slelect 一直超时

VamosCB 2017-11-07 12:54:15

/*
*一些变量的定义
*/
fd_set writefds;
struct timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
//管道已经有其他进程创建了
//创建的管道名称:fifo_req_name
if(access(fifo_req_name,F_OK)<0){ //管道不存在
return ERR;
}
fifo_fd = open(fifo_req_name,O_RDWR);
if(fifo_fd < 0){
/*****/
}
FD_ZERO(&writefds);
FD_SET(fifo_fd,&writefds);
ret = select(fifo_fd+1,&writefds,NULL,NULL,&tv);
if (ret == 0){
printf("time out!\n");
return ERR;
} else if (ret<0 ){
printf("select error!\n");
return ERR;
}else if (ret >0){
if (FD_ISSET(fifo_fd,&writefds)){
/*
*余下操作
*/
}
}

我再linux 下编译运行的,但是代码每次运行到这一步就直接打印time out了。显示超时了,但是那个管道没有其他操作啊,也不可能阻塞啊,可能代码里面有些单词我手打的时候有些小错误,大家可以忽略,第一次用select 判断超时,不知道我这么写哪出问题了。。我和别人写的demo一样啊。。。
...全文
325 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuedahan 2017-12-01
  • 打赏
  • 举报
回复
对正因为在5s内没有数据,所以才超时了呢
heronism 2017-11-10
  • 打赏
  • 举报
回复
楼上正解,用法没问题,第二个参数是readfds,你是等5s就timeout还是不到5s立即timeout,如果是后者再分析
9527 2017-11-08
  • 打赏
  • 举报
回复

 int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict errorfds, struct timeval *restrict timeout);
楼主,你自己man下select看看,select第二个参数是readfds,你没有数据,当然是timeout了,想要判断write,自己看看说明
jamon_tan 2017-11-07
  • 打赏
  • 举报
回复
管道没有写入数据就超时。
jklinux 2017-11-07
  • 打赏
  • 举报
回复
我用mkfifo创建一个管道文件后,测试代码没有问题啊。执行程序会堵塞5秒后才会打印出"time out".

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧