3.2 撰寫一個與3.12節中dup2功能相同的函式,要求不呼叫fcntl函式,并且要有正確的出錯處理,
思路,不斷執行dup函式,直到回傳與newfd相同的檔案描述符,所有都執行結束之后關閉之前dup回傳的檔案描述符
不要忘記特判newfd和fd相同的情況,直接回傳,記住dup2還多了一歩先關閉newfd的步驟
#include "apue.h"
#define BUFFSIZE 16
int main()
{
char buffer[BUFFSIZE];
int fdin,fdout,n;
fdin=my_dup(STDIN_FILENO,3);
fdout=my_dup(STDOUT_FILENO,4);
if(fdin==-1||fdout==-1)
{
err_sys("my_dup error!");
return -1;
}
else
{
printf("STDIN fd : %d\n", fdin);
printf("STDOUT fd : %d\n", fdout);
while((n=read(fdin,buffer,BUFFSIZE))>0)
{
if(write(fdout,buffer,n)!=n)
{
err_sys("write error!\n");
}
}
if(n < 0)printf("read error");
}
return 0;
}
int my_dup(int fd,int newfd)
{
if(fd==newfd)return fd;
if(fd<0||fd>FOPEN_MAX)
{
printf("fd is wrong.\n");
return -1;
}
if(newfd <0||newfd>FOPEN_MAX)
{
printf("newfd is wrong.\n");
return -1;
}
close(newfd);
int fileindex[newfd+1];
int index=0;
while((fileindex[index++]=dup(fd))!=newfd)
{
printf("result after dup(fd):%d\n",fileindex[index-1]);
if(fileindex[index-1]==-1)
{
err_sys("my_dup error!");
return -1;
}
}
int i=0;
for(;i<index-1;i++)
{
close(fileindex[i]);
}
return fileindex[index-1];
}
運行結果:
在服務器上撰寫3.2.c的源代碼,編譯,執行后如下圖:

編譯生成了一個3.2的執行檔案,上述代碼的功能是復制了STDIN_FILENO和STDOUT_FILENO這兩個檔案描述符,分別回傳4和5
編譯生成了一個3.2的執行檔案,上述代碼的功能是復制了STDIN_FILENO和STDOUT_FILENO這兩個檔案描述符,分別回傳4和5
再通過讀寫驗證my_dup是否呼叫成功,出錯處理也在程式中有體現,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/144778.html
標籤:其他
上一篇:bgp網路線路的優勢?
下一篇:MySQL題集
