从命令行将输出重定向到C语言中的文本文件

从命令行将输出重定向到C语言中的文本文件,c,shell,unix,command,C,Shell,Unix,Command,我用c实现了一个shell,我很难将命令的输出重定向到一个文件。 当我将输出发送到文件时,它似乎可以工作,但文件无法打开,当我运行ls-l时,它会显示以下内容: ---------x 1 warp staff 441 Nov 4 20:15 output.txt 这是我代码的一部分 pid = fork(); if(pid == 0) { /* child process */ if(redirFlag) { int fdRedir = open

我用c实现了一个shell,我很难将命令的输出重定向到一个文件。 当我将输出发送到文件时,它似乎可以工作,但文件无法打开,当我运行ls-l时,它会显示以下内容:

---------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);
pid=fork();
如果(pid==0)
{/*子进程*/
if(redirFlag)
{
int fdRedir=打开(重定向名称,O|u WRONLY | O|u CREAT);
如果(FDR<0){
perror(“无法打开”);
出口(1);
}
如果(dup2(fdRedir,标准输出文件号)=-1){
perror(“dup2失败”);
出口(1);
}
} 
执行副总裁(补编[0],补编);
/*仅当exec失败时返回*/
perror(“执行失败”);
出口(-1);

open的原型是:

#include <fcntl.h>  
int open(const char *path, int oflag, ...);
在您的代码中,文件是使用标志
O_create
打开的,但没有指定文件模式。因此您没有对其进行操作的权限。创建新文件时,请尝试指示文件权限:

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

+1:严格地说,原型是
intopen(constchar*path,intoflag,…);
,但最终结果与您所说的差不多:如果您指定
O_create
,您也需要指定第三个参数。如果没有第三个参数,则不确定将什么值作为模式处理;从结果来看,答案似乎是
1
@JonathanLeffler感谢您提供了更严格的原型,我更新了answ呃。
int fdRedir = open(redirectName, O_WRONLY | O_CREAT, 0644);