歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> APUE習題[實現dup2函數功能,不使用fcntl]

APUE習題[實現dup2函數功能,不使用fcntl]

日期:2017/3/1 10:05:51   编辑:Linux編程

學習,記錄。

int dup2(int oldhandle, int newhandle);

函數功能:

復制文件句柄,newhandle指定的dup2和dup的區別就是可以用newfd參數指定新描述符的數值,如果newfd已經打開,則先將其關閉。如果newfd等於oldfd,則dup2返回newfd, 而不關閉它。dup2函數返回的新文件描述符同樣與參數oldfd共享同一文件表項。

關鍵部分實現思路:

先close關閉需要復制到的文件描述符newdup。

連續dup,每dup一次產生的新的fd記錄下來。

當新產生的fd等於需要產生的fd的時候,跳出循環,並把前面產生的fd全都close掉,返回該描述符。

注釋挺詳細,看注釋吧

執行結果:

  1. //Code by Pnig0s1992
  2. //Date:2012,3,28
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <string.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. int my_dup(int olddup,int newdup);
  9. int main(int argc,char ** argv)
  10. {
  11. int newdup = 3;
  12. constchar * filename = "newfile.txt";
  13. int fd = open(filename,O_RDWR);
  14. int newfd = my_dup(fd,newdup);
  15. if(write(newfd,"Test new fd.",strlen("Test new fd.")) < 0)
  16. {
  17. printf("Use new fd write file failed.");
  18. exit(2);
  19. }else
  20. {
  21. printf("Write successfully.");
  22. }
  23. exit(0);
  24. }
  25. int my_dup(int olddup,int newdup)
  26. {
  27. int tempdup;
  28. int icount = 0;
  29. int filedesarr[newdup];
  30. if((tempdup = dup(olddup)) == -1) //判斷原文件描述服是否有效
  31. {
  32. printf("the file desp is invalid.");
  33. exit(1);
  34. }else
  35. {
  36. close(tempdup);
  37. }
  38. if(newdup == olddup) //若新舊文件描述符相等則直接返回
  39. {
  40. return olddup;
  41. }
  42. close(newdup);//關閉要復制的文件描述符
  43. for(icount = 0;icount<newdup+1;icount++) //循環復制文件描述符
  44. {
  45. filedesarr[icount] = 0;
  46. tempdup = dup(newdup);
  47. if(tempdup < 0)
  48. {
  49. return -1;
  50. }else
  51. {
  52. if(tempdup == newdup)
  53. { //若復制後的文件描述符於指定的相等則跳出
  54. break;
  55. }else{
  56. filedesarr[icount] = 1; //否則將對應下標的數組元素置為1
  57. }
  58. }
  59. }
  60. for(icount = 0;icount<newdup+1;icount++) //關閉之前打開的非指定描述符
  61. {
  62. if(filedesarr[icount] == 1)
  63. {
  64. close(icount);
  65. }
  66. }
  67. return tempdup;
  68. }
Copyright © Linux教程網 All Rights Reserved