一個功能類似於dup2() 的函數

在Unix高級環境編程一書中,第三章末尾有這麼一個習題:

3.2  編寫一個與3.12節中dup2功能相同的函數,要求不調用fcntl函數,並且要有正確的出錯處理。

沒有找到好的解決方法,目前想到的方法是利用dup()遍歷fd命名空間至目標fd,返回結果。代碼如下:

int mydup2(int oldfd, int newfd)
{
	if (newfd == oldfd)
		return newfd;

	int *fdp = (int *)malloc(sizeof(int)*newfd);
	int i = 0;

	if (close(newfd) == -1 && errno != EBADF)
		err_sys("close newfd error.");

	while ((fdp[i] = dup(oldfd)) != newfd)
	{
		if (fdp[i] == -1)
			err_sys("dup error.");

		++i;
	}

	for (--i; i >= 0; --i)
	{
		if (close(fdp[i]) == -1)
			err_sys("close fdp error.");
	}
	
	free(fdp);

	return newfd;
}


如果有錯誤,歡迎指正。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章