一个功能类似于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;
}


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