【问题标题】:dup2 not switching to file?dup2 没有切换到文件?
【发布时间】:2019-04-10 20:26:40
【问题描述】:

我正在尝试学习 dup2 并将标准输出切换到文件而不是终端。这是在任何地方都可以使用的示例,但不确定为什么它不适合我。我不认为我需要一个 fork() 因为我不需要一个不同的进程来执行文件中的打印语句。

函数被调用的地方:

int main(int argc, char **argv){
  char *something = "hello";
  saveHistoryToFile(something);
}

//这是函数。有一个文件名history.txt

void saveHistoryToFile(char *history){
  int fw = open("history.txt",O_WRONLY | O_APPEND);
  dup2(fw, 1);
  printf("%s", history);
}

错误:它打印到终端而不是文件!

【问题讨论】:

  • “不适合我”究竟是什么意思?不编译?运行时崩溃?产生错误的结果?
  • 只要"history.txt" 存在,我觉得没问题,否则添加O_CREAT。错误检查 + perror 或在 strace 下运行应该可以揭示问题所在。
  • fflush(stdout);printf() 之后修复了吗?
  • 它不打印到文件中只是打印到终端@JohnBollinger
  • 您没有检查函数调用的返回值以识别它们是否成功。您对open() 的调用很可能失败,因此,您对dup2() 的调用也失败了。这将使您的标准输出仍然连接到终端(或它最初连接到的其他任何东西)。

标签: c file dup2


【解决方案1】:

带有错误检查的代码:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int saveHistoryToFile(char *history);

int main(int argc, char **argv){
  char *something = "hello";
  if(0>saveHistoryToFile(something)) return 1;
  if(0>fclose(stdout)) return perror("fclose"),-1;
}

int saveHistoryToFile(char *history){
  int fw = open("history.txt",O_WRONLY | O_APPEND /*|O_CREAT, 0640*/ );
  if (0>fw) return perror("open"),-1;
  if (0>dup2(fw, 1)) return perror("dup2"),-1;
  if (0>(printf("%s", history)))  return perror("printf"),-1;
}

在第一次运行时,我得到“打开:没有这样的文件或目录”,因为我的当前目录中没有 "history.txt"

如果我添加或取消注释O_CREAT, 0640,它在我的机器上运行良好。

当然,您可能会遇到其他问题(例如,EPERM),但perrors 应该会给您一个提示。

【讨论】:

  • 这给了我权限被拒绝
  • 在函数中打开
  • @BassamMetwally 你不能排除故障吗?你当前的目录是什么它的权限是什么(尝试运行system("stat \"$PWD\" history.txt");)。
  • @BassamMetwally 您还需要一个带有O_CREAT 标志的模式参数。我忘记了那个。
  • 是的!这工作谢谢。我只是运行 chmod 来允许读写。
猜你喜欢
  • 1970-01-01
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 2022-01-06
相关资源
最近更新 更多