Chinaunix首页 | 论坛 | 博客
  • 博客访问: 180925
  • 博文数量: 43
  • 博客积分: 611
  • 博客等级: 中士
  • 技术积分: 1053
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-02 13:37
文章存档

2015年(3)

2013年(23)

2012年(17)

我的朋友

分类: LINUX

2012-12-02 11:29:19

        这是apue的一个习题,要求不用fcntl来实现dup2.这是我的思路:循环调用dup复制file descriptor,直到与指定的相同。如果您有更高效的方法,请告诉小弟我,非常感谢!

        代码如下:


点击(此处)折叠或打开

  1. #include <apue.h>
  2. #include <unistd.h>
  3. #include <my_error.h>
  4. #include <fcntl.h>
  5. #define MAX 1000

  6. //function:neil_dup2
  7. int neil_dup2(int filedes,int filedes2)
  8. {
  9.     if(filedes2==filedes)
  10.         return filedes;
  11.     close(filedes2);
  12.     int fd_list[MAX]={0};
  13.     int i,j;
  14.     for(i=0;i<=filedes2;i++)
  15.     {
  16.         if( (fd_list[i]=dup(filedes))<0)
  17.             err_sys("error dup!");
  18.         if(fd_list[i]==filedes2)
  19.             break;
  20.     }
  21.     for(j=0;j<i;j++)
  22.         close(fd_list[j]);
  23.     return fd_list[i];
  24. }


  25. int main()
  26. {
  27.     int fd1;
  28.     int fd2=10;
  29.     int n=0;
  30.     char buf[]="1234567891";
  31.     if( (fd1=open("temp.foo",O_RDWR))<0 )
  32.         err_sys("open error!");
  33.     dup2(fd1,fd2);
  34.     if( (n=write(fd2,buf,10))!=10)
  35.         error("error write");
  36.     close(fd1);
  37.     close(fd2);
  38.     return 0;
  39. }

阅读(1393) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~