dup2 не переключается на файл? - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь выучить dup2 и переключить стандартный вывод в файл, а не в терминал. Это пример, который работает везде, но не уверен, почему он не работает для меня. Я не думаю, что мне нужна fork (), потому что мне не нужен другой процесс для выполнения только оператора print в файле.

Где вызывается функция:

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

// Это функция. Есть история имен файлов .txt

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

ОШИБКА: он печатает в терминал, а не в файл!

1 Ответ

1 голос
/ 10 апреля 2019

Ваш код с проверкой ошибок:

#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;
}

При первом запуске я получаю "open: Нет такого файла или каталога", потому что у меня нет "history.txt" в моем текущем каталоге.

Если я добавлю или раскомментирую O_CREAT, 0640, на моем компьютере он будет работать нормально.

Конечно, вы можете столкнуться с другими проблемами (например, EPERM), но perror s следуетдать вам подсказку.

...