2013-11-05 160 views
1

我在c中实现了一个shell,并且im很难将命令的输出重定向到一个文件。 当我将输出发送到一个文件,它似乎工作,但该文件未打开,当我运行ls -l命令它让我看到以下内容:从命令行将输出重定向到C文本文件

---------x 1 warp staff 441 Nov 4 20:15 output.txt 

这是我的一些代码部分

pid = fork(); 
if(pid == 0) 
{ /* child process */ 

    if(redirFlag) 
    { 
     int fdRedir = open(redirectName, O_WRONLY | O_CREAT); 
     if(fdRedir < 0){ 
      perror("Can't Open"); 
      exit(1); 
     } 

     if(dup2(fdRedir, STDOUT_FILENO) == -1){ 
      perror("dup2 failed"); 
      exit(1); 
     } 


    } 
    execvp(supplement[0], supplement); 
    /* return only when exec fails */ 
    perror("exec failed"); 
    exit(-1); 

回答

2

open原型为:

#include <fcntl.h> 
int open(const char *path, int oflag, ...); 

当创建文件时,你应该给文件模式。

​​

在你的代码,文件被打开,旗O_CREAT但没有给出文件模式。所以你没有权限操作它。尝试指示文件的权限时,创建新的文件:

int fdRedir = open(redirectName, O_WRONLY | O_CREAT, 0644); 
+1

+1:严格地说,原型['开放的()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/ open.html) 是'int open(const char * path,int oflag,...);',但最终结果与您所说的几乎相同:如果指定了'O_CREAT',则需要指定第三个参数太。没有这一点,它是不确定的价值被视为模式;从结果看来,答案似乎是'1'。 –

+0

@JonathanLeffler感谢您提供更严格的原型,我更新了答案。 –

相关问题