您的位置:首页 > 其它

写一个dup2功能相同的函数,不能调用 fcntl 函数,并且要有出错处理

2015-08-17 16:58 459 查看
实现的时候用到系统原来的dup函数

// mydup2.c
// 2015/08/17    Lucifer Zhang    version1.0
// write my own dup2 function
// use dup() function when inplementation

#include <unistd.h> // include dup()
#include <stdio.h>
#include <stdlib.h>

#define OPEN_MAX 256
/*
* when the descriptor is negative or greater than OPEN_MAX, will make a errro
* */

int my_dup2(int fd, int newfd);

int main(int argc, char *argv[])
{
int newfd, return_fd;

if (argc != 2) {
printf("usage: a.out test.txt\n");
exit(0);
}
printf("Please input the descriptor than you want to set: ");
scanf("%d", &newfd);

// open a file
int fd = open(argv[1], 0);
if (fd == -1) {
perror(argv[1]); // print error msg
exit(0);
}

printf("old descriptor is: %d\n", fd);
return_fd = my_dup2(fd, newfd);
printf("new descriptor is: %d\n");
close(fd);
close(return_fd);

exit(0);
}

int my_dup2(int fd, int newfd)
{
int count = 0;
int fdarry[newfd]; // record opened descriptor

if (newfd < 0 || newfd > OPEN_MAX) {
printf("the new descriptor error!\n");
exit(0);
}

// dup() return the lowest-numbered available file descriptor
if ((fdarry[count] = dup(fd)) == -1) {
printf("dup() function error!\n");
exit(0);
} else { // test old file descriptor if can be used
close(fdarry[count]);
}

// if fd equals newfd, then dup2 returns newfd without closing it
if (fd == newfd) {
return fd;
}

close(newfd); // close

// the main implementation
for (count = 0; count <= newfd; ++count) {
if ((fdarry[count] = dup(fd)) == -1) {
printf("dup() funciont error!\n");
exit(0);
} else {
printf("the descriptor is: %d\n", fdarry[count]);
if (fdarry[count] == newfd) {
break;
}
}
}

for (count = 0; count <= newfd; ++count) {
if (fdarry[count] == newfd) {
return fdarry[count];
} else {
close(fdarry[count]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: