在 C 中重定向 stderr
Redirecting stderr in C
我正在用 C 编写一个简单的 shell,遇到了一个小问题。
我有以下功能:
int execStdErr(char** parsedArguments, int numberOfArgs) {
fflush(stderr);
int fd;
int parsedCommandLength = 0;
char** parsedCommand = parseLine(parsedArguments[0], &parsedCommandLength);
parsedArguments[numberOfArgs - 1] = deleteSpaces(parsedArguments[numberOfArgs - 1]);
if (fork() == 0) {
if (fd = open(parsedArguments[numberOfArgs - 1], O_WRONLY | O_CREAT |O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) < 0) {
perror("lsh");
return 1;
}
if (dup2(fd, 2) < 0) {
perror("lsh") ;
return 1;
}
close(fd);
execvp(parsedCommand[0], parsedCommand);
exit(0);
}
close(fd);
wait(NULL);
return 0;
}
parsedArguments 是由 2>
拆分的参数,然后我将最后一个参数作为我的文件名,然后我通过按空格拆分它们来处理前一个参数(它们在 parsedCommand
).出于某种原因 stderr
打印在屏幕上,如果它不存在,它会创建一个文件,但它总是空的。我不知道这里可能是什么问题。
常见错误:
if (fd = open(...) < 0)
相当于
if (fd = (open(...) < 0))
这不是你想要的。您需要:
if ( (fd = open(...)) < 0)
当 open
成功时,open(...) < 0
求值为 false,并且 fd = open(...) < 0
将 0
分配给 fd
。然而,open
返回的值丢失了。
我正在用 C 编写一个简单的 shell,遇到了一个小问题。 我有以下功能:
int execStdErr(char** parsedArguments, int numberOfArgs) {
fflush(stderr);
int fd;
int parsedCommandLength = 0;
char** parsedCommand = parseLine(parsedArguments[0], &parsedCommandLength);
parsedArguments[numberOfArgs - 1] = deleteSpaces(parsedArguments[numberOfArgs - 1]);
if (fork() == 0) {
if (fd = open(parsedArguments[numberOfArgs - 1], O_WRONLY | O_CREAT |O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) < 0) {
perror("lsh");
return 1;
}
if (dup2(fd, 2) < 0) {
perror("lsh") ;
return 1;
}
close(fd);
execvp(parsedCommand[0], parsedCommand);
exit(0);
}
close(fd);
wait(NULL);
return 0;
}
parsedArguments 是由 2>
拆分的参数,然后我将最后一个参数作为我的文件名,然后我通过按空格拆分它们来处理前一个参数(它们在 parsedCommand
).出于某种原因 stderr
打印在屏幕上,如果它不存在,它会创建一个文件,但它总是空的。我不知道这里可能是什么问题。
常见错误:
if (fd = open(...) < 0)
相当于
if (fd = (open(...) < 0))
这不是你想要的。您需要:
if ( (fd = open(...)) < 0)
当 open
成功时,open(...) < 0
求值为 false,并且 fd = open(...) < 0
将 0
分配给 fd
。然而,open
返回的值丢失了。