Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的重定向运算符不工作_C_Linux - Fatal编程技术网

C中的重定向运算符不工作

C中的重定向运算符不工作,c,linux,C,Linux,我只是在做这个C程序,它就像一个终端,我已经实现了“dir”命令,但我还想实现重定向“>”操作符,这样我就可以将所有内容重定向到一个文件。我制作了一个等待输入的C程序,我想把输入发送到.txt文件 这是output.c,它等待用户输入 #include <stdio.h> #define SIZE 500 int main(int argc, char *argv[]){ char text[SIZE]; scanf("%s", text); return 0; } 问题

我只是在做这个C程序,它就像一个终端,我已经实现了“dir”命令,但我还想实现重定向“>”操作符,这样我就可以将所有内容重定向到一个文件。我制作了一个等待输入的C程序,我想把输入发送到.txt文件

这是output.c,它等待用户输入

#include <stdio.h>
#define SIZE 500

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

char text[SIZE];

scanf("%s", text);

return 0;

}
问题是,等待用户输入的输出程序似乎没有执行。你们能帮帮我吗

更新
我已经更新了我的代码。现在新进程正在执行,但当我在stdin中键入类似“name”的内容时,我的文件包含一些奇怪的符号,它们在我退出主程序之前不会出现。为什么会这样?

会发生什么?您没有等待
output
退出,因此您的程序将继续。当我键入
dir>output.txt
时。请忽略这个dir,我只是在一个argv[0]为dir时将其编码,输出程序不执行,主程序继续,终端继续。但是,当我退出主程序时,在我创建的txt文件中会出现一个类似“#[a”的字符串。即使终端工作,它也会继续运行,因为您不必等待进程完成(就像在真实的shell中运行
/output&
)。您可以使用
等待
man 2 wait
)如果希望shell等待
输出
完成。它可能执行正确,但您无法判断,因为shell仍在继续。(您可以使用
strace
查看是否存在这种情况)你把代码放在哪里?你的main发出一个scanf,然后退出,而不调用任何东西来处理文本。因此,当你完成输入文本时,你就完成了。关于这一行:
scanf(“%s”,text);
即使
text
为500字节,用户也可以轻松地溢出输入缓冲区
text
。强烈建议使用:
scanf(“%499s”,text);
因为1)避免了溢出输入缓冲区的未定义行为。2)为
scanf()的NUL字节留出空间使用“%s”格式说明符时,
将始终追加。会发生什么情况?您没有等待
输出
退出,所以程序将继续。当我键入
dir>output.txt
时。请忽略该目录,我只是在if argv[0]中对其进行了编码是dir,输出程序不执行,主程序继续。但是当我退出主程序时,一个类似“#[a”的字符串出现在我创建的txt文件中。终端即使工作也会继续,因为你不必等待进程完成(就像在真实的shell中运行
/output&
)。如果希望shell等待
输出完成,可以使用
wait
man 2 wait
)。它可能执行正确,但您无法判断,因为shell仍在继续。(您可以使用
strace
查看是否存在这种情况)你把代码放在哪里?你的main发出一个scanf,然后退出,而不调用任何东西来处理文本。因此,当你完成输入文本时,你就完成了。关于这一行:
scanf(“%s”,text);
即使
text
为500字节,用户也可以轻松地溢出输入缓冲区
text
。强烈建议使用:
scanf(“%499s”,text);
因为1)避免了溢出输入缓冲区的未定义行为。2)为
scanf()的NUL字节留出空间
在使用“%s”格式说明符时将始终追加。
int rv;
pid_t pid;
int commpipe[2];

if(argc > 2){

    char filename[] = "output.txt";
    int old_prn_han, new_prn_han;

    old_prn_han = dup(fileno(stdout));
    strcpy(filename, argv[2]);

    if((new_prn_han = open(filename, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR)) == -1){
        fprintf(stderr, "Unable to create/open file '%s'\n", filename);
        return 1;
    }

    dup2(new_prn_han, fileno(stdout));

    if((pid=fork()) == -1){
        fprintf(stderr, "Error forking new process!\n");
        exit(2);
    }

    if(pid){
        //Parent process
        close(commpipe[0]);
        setvbuf(stdout,(char*)NULL,_IONBF,0);
        sleep(2);
        wait(&rv);
        fprintf(stderr, "Child exited with a %d value\n", rv);
    }else{
    //Child process
        dup2(commpipe[0],0);
        close(commpipe[1]);

        if(execl("output", "output", NULL) == -1){
            fprintf(stderr, "Error executing new process!\n");
            exit(3);
        }
    } 


    close(fileno(stdout));
    dup2(old_prn_han, fileno(stdout));

}