【发布时间】:2022-01-05 06:32:27
【问题描述】:
我正在用 c 语言制作自己的 shell,现在我正在尝试创建一个函数,将 shell 的标准错误重定向到特定文件,该选项可以显示标准错误当前的去向以及另一个能够将 stderr 重置为原来的样子。
我已经实现了这段代码来重定向标准错误:
int fd, new_fd;
if((fd = open(tokens[1], O_RDWR)) == -1){
perror("Error opening: ");
return 0;
}
if(dup2(fd, STDERR_FILENO) == -1){
perror("Error: ");
}
if(close(fd) == -1){
perror("Error closing: ");
}
现在,我找不到任何可以恢复或显示标准错误的选项的东西,如果有人可以帮助我实现这一点,那就太棒了!
if(tokens[1] == NULL){
//Shows where the standard error is currently going to
return 0;
}
if(strcmp(tokens[1], "-reset") == 0){
//Restores the standard error to what it was originally
return 0;
}
【问题讨论】:
-
tokens[1] 在第一个代码中是文件名!
-
如果你将
stderr重定向到一个文件(如第一个sn-p所示),那么你知道文件名 - 将它保存到一个局部变量/文件中以便持久化,并显示它根据要求发给用户。如果我误解了您 - 请添加一些有关每个 sn-p 代码运行的上下文的信息。 -
我明白你所说的,并会这样做来显示它,但在默认情况下,我应该显示什么文件,默认情况下 stderr 所在的文件是什么?
-
通常一个shell重定向一个子进程的输出,而不是它自己的输出。
-
您是否使用标准 shell(如 bash)来运行您的 shell?在这种情况下,我相信
stderr会像往常一样打印到屏幕上。正如上面的评论所说 - 你应该将你的 shell 的stderr和你的 shell 的子进程的stderr分开。