【发布时间】:2018-11-20 05:18:49
【问题描述】:
我正在尝试实现输入和输出重定向是 C。我阅读了这个问题的所有答案,但它不起作用!它转到最后一个 if (execvp)。
我想要这样的东西:
输出重定向:ls -al > output.txt
输入重定向:sort < input.txt
这是我写的代码:
int io_redirection(char * args[], char* inputFile, char* outputFile, int option){
int err = -1;
int fileDescriptor = -1; // between 0 and 19
pid_t pid = -10;
pid = fork();
if(pid==-1){
printf("Child process could not be created\n");
return;
}
if(pid==0){
// Option 0: output redirection
if (option == 0){
// I also tried fileDescriptor = creat(outputFile, 0644);
fileDescriptor = open(outputFile, O_CREAT | O_TRUNC | O_WRONLY, 0600);
dup2(fileDescriptor, STDOUT_FILENO);
close(fileDescriptor);
}
else if (option == 1){
// Option 1: input redirection
fileDescriptor = open(inputFile, O_RDONLY, 0600);
dup2(fileDescriptor, STDIN_FILENO);
close(fileDescriptor);
}
if (execvp(args[0],args)==err){
printf("err");
kill(getpid(),SIGTERM);
}
}
waitpid(pid,NULL,0);
}
对于输出重定向args 包含ls 和-al。对于输入,它包含sort。
【问题讨论】:
-
你不需要测试来自
execvp()的返回值——如果它返回,它就失败了;如果成功,则不会返回。您似乎不允许sort < input.txt > output.txt— 单个命令上的输入和输出重定向。 -
没有A Minimal, Complete, and Verifiable Example (MCVE)很难说
args处于什么状态?是否已经删除了包含'<'或'>'的元素和文件名,以便只保留其他参数? -
@JonathanLeffler 不是这样,我在我的代码中多次使用这种方法(例如在
pipe,它没有引起任何问题),此外我试图删除测试它的返回,但这样,它不会跳出循环。 -
@DavidC.Rankin 对于这个例子
ls -al > output.txt:args 包含ls和-al
标签: c shell io-redirection