Chinaunix首页 | 论坛 | 博客
  • 博客访问: 71737
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 245
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-10 08:06
文章分类
文章存档

2015年(24)

我的朋友

分类: LINUX

2015-07-03 22:55:15

1、cat file1 > file2 将file1中的内容复制到file2中。
2、dup/dup2
如果两个文件描述符指向同一个file结构体,file结构体只有一份FILE STATUS FLAG和文件位置。
如果用open函数两次打开同一个文件那么得到的文件描述符不同,每个文件描述符指向的file结构体也不同,因此包含了不同的FILE STATUS FLAG和文件位置。
dup函数
所需头文件:#include<unistd.h>
函数原型:int dup(int oldfd)
oldfd :已经打开的文件的文件描述符
返回值:成功时返回新的文件描述符,失败时返回-1并设置errno。
用法:s_fd = dup(int oldfd); //返回一个新的文件描述符,这个文件描述符是没有用到的最小的文件描述符,这个文件描述符与oldfd共享一个文件表项。

点击(此处)折叠或打开

  1.  #include <unistd.h>
  2.    #include <stdio.h>
  3.    #include <string.h>
  4.    #include <fcntl.h>
  5.    #include <stdlib.h>
  6.    int main()
  7.    {
  8.        int fd, copy_fd, res;

  9.        char buf1[] = "abd";
  10.        char buf2[] = "wwww";
  11.        char buf3[10] = {0};

  12.        memset(buf3, '\0', 10);

  13.        fd = open("./test.txt", O_RDWR | O_CREAT);
  14.        printf("fd = %d\n", fd);
  15.        copy_fd = dup(fd);
  16.        printf("copy_fd = %d\n", copy_fd);
  17.   
  18.   while(1)
  19.   {
  20.       res = write(fd, buf1, 3);
  21.       if(res == -1)
  22.   {
  23.       perror("fail to write\n");
  24.       exit(1);
  25.   }

  26.   else if(res == 3)
  27.   break;
  28.   }
  29.   lseek(fd, 0, SEEK_SET);
  30.   while(1)
  31.   {
  32.       res = read(fd, buf3, 3);
  33.       if(res == -1)
  34.       {
  35.           perror("fail to write\n");
  36.           exit(1);
  37.       }
  38.       else if(res == 3)
  39.           break;
  40.   }
  41.   printf("----%s\n", buf3);
  42.   close(fd);
  43.   close(copy_fd);
  44.   return 0;
  45.   }
编译之后执行,结果为:
fd = 3
copy_fd = 4
----abd
copy_fd = 4可看出dup返回的是没有用到的最小的文件描述符。
copy_fd = dup(fd);使得copy_fd 与fd指向同一个文件,通过fd向文件写入abc,通过copy_fd从文件读取的结果也是abc。

使用dup函数之前,用open函数打开一个文件,文件描述符为fd =3




        使用dup函数 copy_fd = dup(fd);效果如下:







dup2函数
所需头文件:#include<unistd.h>
函数原型:int dup2(int oldfd, int newfd)
oldfd :已经打开的文件的文件描述符
newfd:  指定返回的文件描述符
返回值:成功时返回newfd的文件描述符,失败时返回-1并设置errno。
用法:s_fd = dup(int oldfd,int newfd); //s_fd等于newfd的值,解除newfd/s_fd的文件表指针与文件表的关联,newfd/s_fd         与oldfd共享一个文件表项
用一个例子解释:

点击(此处)折叠或打开

  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <fcntl.h>
  5. #include <stdlib.h>
  6. int main()
  7. {
  8.     int new_fd, old_fd, copy_fd, res;
  9.     char buf1[] = "abd";
  10.     char buf2[] = "wwww";
  11.     char buf3[10] = {0};
  12.     memset(buf3, '\0', 10);
  13.     new_fd = open("./test.txt", O_RDWR | O_CREAT);
  14.     printf("new_fd = %d\n", new_fd);
  15.     old_fd = open("./test1.txt", O_RDWR | O_CREAT);
  16.     printf("old_fd = %d\n", old_fd);

  17.     copy_fd = dup2(new_fd, old_fd);
  18.     printf("copy_fd = %d\n", copy_fd);

  19.     while(1)
  20.     {
  21.         res = write(new_fd, buf1, 3);
  22.         if(res == -1)
  23.         {
  24.             perror("fail to write\n");
  25.             exit(1);
  26.         }
  27.         else if(res == 3)
  28.             break;
  29.     }
       lseek(copy_fd, 0, SEEK_SET);
       while(1)
       {
            res = read(old_fd, buf3, 3);
            if(res == -1)
            {
                perror("fail to write\n");
                exit(1);
            }
            else if(res == 3)
                break;
       }
       printf("----%s\n", buf3);
       close(new_fd);
       close(copy_fd);
       return 0;
    }
编译之后执行,结果为:
new_fd = 3
old_fd = 4
copy_fd = 4
----abd

可以看出使用了copy_fd = dup2(new_fd, old_fd);copy_fd 与old_fd大小相等。
通过
copy_fd 、new_fd、old_fd操作的是同一个文件。

使用dup2之前用open函数打开两个文件文件描述符分别为   3、4对应图如下:






































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