我正在用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
返回的值丢失了。