c - 在 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# - 通过 RTP 发布解码 H264
- python - 使用udf计算与pyspark数据框中特定值匹配的键值
- c++ - 防止 std::ifstream 创建空文件
- javascript - 尝试将音频/视频内容作为文件切片附加到媒体源的源缓冲区中
- excel - 在 DAX 中测量总计
- python - TypeError:不能在类似字节的对象上使用字符串模式——mimetypes.guess_type
- powershell - 获取一组用户的邮箱权限
- python - Pandas:将函数 f(c1, c2) 应用于列的所有成对组合
- machine-learning - 如何获得梯度的二阶矩
- scikit-learn - 使用 sklearn 回归矩阵形输出