当前位置: 技术问答>linux和unix
在编写一个同dup(2)功能相同的函数,要求不调用fcntl函数并且要有正确的出错处理
来源: 互联网 发布时间:2015-07-26
本文导语: 在编写一个同dup(2)功能相同的函数,要求不调用fcntl函数并且要有正确的出错处理,哪位大哥熟悉unix编程,给小弟解答一下,不胜感激。 | 不知道这个中不中:(我写的,根据apue) #include #in...
在编写一个同dup(2)功能相同的函数,要求不调用fcntl函数并且要有正确的出错处理,哪位大哥熟悉unix编程,给小弟解答一下,不胜感激。
|
不知道这个中不中:(我写的,根据apue)
#include
#include
#include
#include
#include
#define EBADF -1
/* simulate the dup2 routines */
int
mydup2(int filedes, int filedes2)
{
int ret, i;
int newfd, fds[255];
char cmd[32];
/* test if filedes and filedes2 valid(0~255) */
if( filedes 255 || filedes2 255 )
return EBADF;
/* weather the filedes is opend? */
if( (ret = fcntl(filedes, F_GETFL, 0) == -1 ) )
return EBADF;
/* filedes == filedes2 ? */
if( filedes == filedes2 )
return filedes2;
else {
if( (ret = fcntl(filedes2, F_GETFL, 0) != -1) ) {
/* close the file, first! */
close(filedes2);
}
/* call open system call to duplicate file descriptor */
memset(fds, -1, sizeof(fds)/sizeof(fds[0]));
memset(cmd, 0, 32);
sprintf(cmd, "%s/%d", "/dev/fd", filedes);
printf("cmd = %sn", cmd);
while( (newfd = open(cmd, 0)) != -1 ) {
if( newfd filedes2 ) {
puts("ERROR: newfd > filedes2!");
return -1;
} else break;
} /* while... */
} /* else... */
/* close fds if exists. */
if( newfd != -1 )
for( i = 0; i 0 ) {
write(STDOUT_FILENO, buf, n);
}
if( n
#include
#include
#include
#include
#include
#define EBADF -1
/* simulate the dup2 routines */
int
mydup2(int filedes, int filedes2)
{
int ret, i;
int newfd, fds[255];
char cmd[32];
/* test if filedes and filedes2 valid(0~255) */
if( filedes 255 || filedes2 255 )
return EBADF;
/* weather the filedes is opend? */
if( (ret = fcntl(filedes, F_GETFL, 0) == -1 ) )
return EBADF;
/* filedes == filedes2 ? */
if( filedes == filedes2 )
return filedes2;
else {
if( (ret = fcntl(filedes2, F_GETFL, 0) != -1) ) {
/* close the file, first! */
close(filedes2);
}
/* call open system call to duplicate file descriptor */
memset(fds, -1, sizeof(fds)/sizeof(fds[0]));
memset(cmd, 0, 32);
sprintf(cmd, "%s/%d", "/dev/fd", filedes);
printf("cmd = %sn", cmd);
while( (newfd = open(cmd, 0)) != -1 ) {
if( newfd filedes2 ) {
puts("ERROR: newfd > filedes2!");
return -1;
} else break;
} /* while... */
} /* else... */
/* close fds if exists. */
if( newfd != -1 )
for( i = 0; i 0 ) {
write(STDOUT_FILENO, buf, n);
}
if( n