2017-10-05 186 views
0

我一直在试图重定向输出到一个文件,并从文件而不是标准输入读取通过使用函数,但它似乎没有工作,因为当我重定向到一个文件并检查看看是否已经用输出创建了一个文件,那里什么也没有。这个函数可能有什么错误。重定向标准输出到文件 - 在C

/* Redirect a standard I/O file descriptor to a file 
    * Arguments: filename the file to/from which the standard I/O file 
    *    descriptor should be redirected 
    *  flags indicates whether the file should be opened for reading 
    *   or writing 
    *  destfd the standard I/O file descriptor which shall be 
    *   redirected 
    * Returns: -1 on error, else destfd 
    */ 
    int redirect(char *filename, int flags, int destfd){ 

      int ret; 

      if(flags == 0){ 
       destfd = open(filename,O_RDONLY); 

       if (destfd < 0){ 
        return -1; 
       } 
       ret = dup2(0,destfd); 

       if(ret < 0){ 
       return -1; 
      } 
       close(destfd); 
      } 

      if(flags == 1){ 
       destfd = open(filename,O_APPEND|O_WRONLY); 

      if (destfd < 0){ 
        return -1; 
      } 

      ret = dup2(destfd,1); 

      if(ret < 0){ 
       return -1; 
      } 
      close(destfd); 
      } 
      return destfd; 
     } 
+3

为什么'destfd'参数传递给函数? –

回答

-1

os函数dup2()应该提供你所需要的(如果没有引用你所需要的)。

更具体地说,您可以将stdin文件描述符dup2()复制到另一个文件描述符,使用stdin执行其他操作,然后在需要时复制它。

dup()函数复制一个打开的文件描述符。具体而言,它使用F_DUPFD常量命令值为fcntl()函数提供的服务提供备用接口,其第三个参数为0。重复的文件描述符与原始文件共享任何锁定。

成功时,DUP()返回具有以下共同点与原来一个新的文件描述符:

相同的打开文件(或管道) 相同的文件指针(两个文件描述符共享一个文件指针) 相同的访问模式(读,写或读/写)

一切我说可以the manpage of dup

1

发现有几个问题,你的代码,而不是其中最重要的是非常糟糕的格式,这使得它很难读书。

例如,这个对dup2的调用是反向的 - 它将用一个stdin副本替换最近打开的destfd

ret = dup2(0,destfd); 

然后几行后您关闭destfd

if声明可能会受益于您了解elseelse if

if(flags == 0) { 
// code 
} else if(flags == 1) { 
// code 
} 

真的不过你可以通过简化治疗flags参数为相同的标志整体功能你会传递给open,并有destfd为您要替换的文件描述符。

int redirect(char *filename,int flags, int destfd) 
    { 
    int fd; 

    fd=open(filename,flags,S_IRUSR|S_IWUSR); 
    if(fd!=-1) 
     { 
     if(dup2(fd,destfd)==-1) 
      { 
      close(fd); 
      fd=-1; 
      } 
     else 
      { 
      close(fd); 
      } 
     } 
    return fd; 
    } 

然后,你可以这样调用它

redirect("output.txt",O_CREAT|O_WRONLY,1); // Redirect stdout 
redirect("input.txt",O_RDONLY,0); // Redirect stdin 
+0

甚至在最后的调用中使用'STDOUT_FILENO'和'STDIN_FILENO'来代替1和0。 –

相关问题