加载中…
个人资料
来一桶
来一桶
  • 博客等级:
  • 博客积分:0
  • 博客访问:7,582
  • 关注人气:1
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
正文 字体大小:

linux 下阻塞睡眠等待selec函数简单实现

(2012-03-19 21:46:44)
标签:

杂谈

分类: linux系统编程


#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <stdio.h>

#include <sys/select.h>


#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

#define OPEN_FLAG  O_RDWR|O_CREAT
#define OPEN_MODE  00777
#define CONTENT    "howaylee"

int main(int argc, char* argv[])
{
 int fd1 = -1;
 int fd2 = -1;
 int ret = -1;

 fd_set r_fds ;
 fd_set w_fds ;
 int max_fds = 0;

 char buf[12] = {0};

 //open file1
 fd1 = open(argv[1], OPEN_FLAG, OPEN_MODE);
 if(-1 == fd1 )
 {
  perror("open fd1 failed: ");
  return -1;
 }

 //write
 ret = write(fd1, CONTENT, sizeof(CONTENT));
 if(-1 == ret )
 {
  perror("write fd1 failed: ");
  return -1;
 }

 //lseek head
 ret = lseek(fd1, 0, SEEK_SET);
 if(-1 == ret )
 {
  perror("lseek fd1 failed: ");
  return -1;
 }
 //open file2
 fd2 = open(argv[2], OPEN_FLAG, OPEN_MODE);
 if(-1 == fd2 )
 {
  perror("open fd2 failed: ");
  return -1;
 }

 
 //获取max_fds,为最大fd值加一
 max_fds = (fd1 > fd2)?(fd1+1):(fd2+1);
 //清空读写文件集
 FD_ZERO(&r_fds);
 FD_ZERO(&w_fds);
 //设置读写文件集
 FD_SET(fd1, &r_fds);
 FD_SET(fd2, &w_fds);
 while(1)
 {
  //lseek head
  ret = lseek(fd1, 0, SEEK_SET);
  if(-1 == ret )
  {
   perror("lseek fd1 failed: ");
   return -1;
  }
  //文件阻塞,监测谁有数据
  ret = select(max_fds, &r_fds, &w_fds, NULL, NULL);
  if(0 > ret )
  {
   perror("select failed: ");
   return -1;
  }
  //文件1是否就绪,可读
  if(FD_ISSET(fd1, &r_fds))
  {
   //read file1
   ret = read(fd1, buf, sizeof(buf));
   if(-1 == ret )
   {
    perror("read to buf failed: ");
    return -1;
   }
  }
  //文件2是否就绪,可写
  if(FD_ISSET(fd2, &w_fds))
  {
   //write file2
   ret = write(fd2, buf, sizeof(buf));
   if(-1 == ret )
   {
    perror("write to fd2 failed: ");
    return -1;
   }
  }
 }
 //close file1 file2
 close(fd1);
 close(fd2);

 return 0;
}

 


 

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有