C中的重定向运算符不工作
我只是在做这个C程序,它就像一个终端,我已经实现了“dir”命令,但我还想实现重定向“>”操作符,这样我就可以将所有内容重定向到一个文件。我制作了一个等待输入的C程序,我想把输入发送到.txt文件 这是output.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; } 问题
#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));
}