APUE2e之Exercise 3.2

17 篇文章 0 订阅
11 篇文章 0 订阅

My implementation for APUE2e Exercise3.2: implement my own dup2 function that performs the same service as the dup2 function. Based on a little testing, it seems to work and behave as the provided dup2 function. I used the dup function to implement mydup2 function. However, I didn’t work on the error handling part, just succeed or fail.

/*
 * exercise3-2.c
 *
 *  Created on: Sep 10, 2011
 *      Author: zhuhuang
 */
 
//Goal: implement dup2 using dup
 
#include <apueerr.h>
 
//file descriptor if OK, -1 on error.
//olddes should be an existing file descriptor, otherwise error is return: Bad file descriptor.
int mydup2(int olddes, int newdes)
{
	int tempdes;
	int result;
 
	if(olddes < 0 || newdes < 0)
		return -1;
		//err_sys("Error: a file descriptor is a non-negative integer.");
 
	if(olddes == newdes)
		return newdes;
 
	if((tempdes = dup(olddes)) == -1)
		return -1;
		//err_sys("dup error"); //return -1?
 
	if(tempdes == newdes){
		return newdes;
	}else if(tempdes > newdes){
		close(newdes); //newdes is already open. close it to make it be the lowest-numbered available file descriptor. used for next dup call.
		result = mydup2(olddes, newdes);
		close(tempdes);
	}else{ //tempdes < newdes. newdes is still available. keep duping until newdes is reached.
		result = mydup2(olddes, newdes);
		close(tempdes);
	}
	return result;
}
 
int main(void)
{
	int resultdes1;
	int resultdes2;
 
	if((resultdes1 = dup(1)) == -1)
		err_sys("dup error 1");
	printf("File descriptor returned by dup(1): %dn", resultdes1);
 
    /*
	if((resultdes2 = dup2(1, resultdes1 + 10)) == -1)
		err_sys("dup2 error 1");
	printf("File descriptor returned by dup2(1, resultdes1 + 1): %dn", resultdes2);
    */
 
    /*
    //what will happen if dup a non-existing file descriptor
	if((resultdes1 = dup(resultdes1 + 5)) == -1)
		err_sys("dup error 2");
	printf("File descriptor returned by dup(resultdes1 + 5): %dn", resultdes1);
    */
 
    /*
	//what will happen if dup a non-existing file descriptor
	if((resultdes2 = dup2(resultdes1 + 5, resultdes1 + 6)) == -1)
		err_sys("dup2 error 2");
	printf("File descriptor returned by dup2(resultdes1 + 5, resultdes1 + 6): %dn", resultdes2);
    */
 
	if((resultdes2 = mydup2(1, resultdes1 + 10)) == -1)
		err_sys("mydup2 error 1");
	printf("File descriptor returned by mydup2(1, resultdes1 + 1): %dn", resultdes2);
 
	//what will happen if dup a non-existing file descriptor
	if((resultdes2 = mydup2(resultdes1 + 5, resultdes1 + 6)) == -1)
		err_sys("mydup2 error 2");
	printf("File descriptor returned by dup2(resultdes1 + 5, resultdes1 + 6): %dn", resultdes2);
 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值