/*
*一些变量的定义
*/
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一样啊

解决方案 »

  1.   

    我用mkfifo创建一个管道文件后,测试代码没有问题啊。执行程序会堵塞5秒后才会打印出"time out".
      

  2.   


     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,自己看看说明
      

  3.   

    楼上正解,用法没问题,第二个参数是readfds,你是等5s就timeout还是不到5s立即timeout,如果是后者再分析