strncpy函數,重寫dup2函數

 2023-11-19 阅读 22 评论 0

摘要:在unix環境高級編程的第三章中有一道題目是這樣的: 重寫dup2函數,不能使用fnctl函數,要有規范的容錯處理 剛開始沒有什么思路,后來在網上查了一下,發現大多數的處理都是,一直調用dup直到得到我們所想要的文件描述符為止,然后
在unix環境高級編程的第三章中有一道題目是這樣的:
重寫dup2函數,不能使用fnctl函數,要有規范的容錯處理

剛開始沒有什么思路,后來在網上查了一下,發現大多數的處理都是,一直調用dup直到得到我們所想要的文件描述符為止,然后關閉不需要的文件描述符。代碼如下:

#include <unistd.h>
#include <stdio.h>int mydup2(int fd,int fd2)
{int fdtmp[fd2+1];int loop;int loop1;// 判斷fd的范圍if( (fd<0)||(fd>63) ){printf("fd=%d is out of range!\n",fd);return -1;}if( (fd2<0)||(fd2>63) ){printf("fd2=%d is out of range!\n",fd2);return -2;}//判斷fd是否被打開if( (fdtmp[0]=dup(fd))==-1 ){printf("fd=%d is not a file descriptor!\n",fd);return -3;}if( (fdtmp[0]==fd2)||(fd==fd2) ){return fd2;}//關閉fd2close(fd2);close(fdtmp[0]);//一直dup到所期望的文件描述符為止for(loop=0;loop<=fd2;loop++){if( (fdtmp[loop]=dup(fd))<0 ){printf("dup error!\n");return -4;}else{if( fdtmp[loop]==fd2 ){break;}}}//關閉不符合要求的文件描述符for(loop1=0;loop1<loop;loop1++){if( close(fdtmp[loop1])<0 ){printf("close fd error!\n");return -5;}}return fd2;
}int main(void)
{int fd;char buff[10]={'a','b','c','d','e','f','g','h','i','j'};if( (fd=mydup2(0,20))>0 ){printf("fd=%d\n",fd);}write(fd,buff,10);return 0;
}

需要說明的一點是,有的系統對文件描述符的上界沒有限制,不需要進行上界的檢查。



版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/183632.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息