Требуется ли задержка между файлом, созданным с помощью внешней программы с помощью system (), и открытием его с помощью open ()? - PullRequest
1 голос
/ 19 декабря 2011

Я пытаюсь создать архив TAR из моей программы, а затем открываю архив для дальнейшей обработки.У меня задержка в 2 секунды между звонками system() и open().Пока все работает нормально, но я не уверен, зачем нужна задержка в 2 секунды или если это правильное решение.

Без задержки я получаю код ошибки 2 (ENOENT "Нет такого файла или каталога") из open() звонка.Моей первой мыслью было, что файловая система не обновляется достаточно быстро, и open() не может найти файл.Но что, если система действительно занята?Нужна ли более длительная задержка?Должен ли я цикл до open() успеха вместо задержки?Проблема в чем-то совершенно ином?

ОБНОВЛЕНИЕ
Корневой файловой системой является EXT2./tmp монтируется в ОЗУ с использованием TMPFS.Я использую tar для создания архива, а не для извлечения содержимого одного.По сути, моя программа должна создавать архив некоторых файлов журналов и отправлять их по сети (поэтому я открываю архив после его создания).

int return_value = system("/bin/tar -czf /tmp/logs.tar.gz /var/log/mylogs.log* &> /dev/null");
// error checks on return_value as described here: http://linux.die.net/man/2/wait
if(return_value != 0) {
  return return_value;
}
//usleep(2000000);
return_value = open("/tmp/logs.tar.gz", O_RDONLY | O_LARGEFILE, 0);
// success or failure depending on whether there's a delay or not

Ответы [ 3 ]

2 голосов
/ 20 декабря 2011

Вы даже можете избежать запуска внешней команды tar, используя libtar непосредственно в вашей программе.


ДОБАВЛЕНО

И вы должны показать нам свою программу. Я уверен, что если вызов system просто извлек файл через tar, он будет доступен сразу после успешного system вызова, например что-то вроде:

 int err = system("/bin/tar xf /tmp/foo.tar bar");
 int fd = -1;
 if (err == 0)
      fd = open("bar", O_RDONLY);
 // fd is available

нет причин ждать несколько секунд в этом коде. Возможно, вы делаете более сложные вещи или забыли проверить результат system

1 голос
/ 20 декабря 2011

Вы думаете, что перенаправляете вывод tar с помощью "&>", но на самом деле вы запускаете его в фоновом режиме, потому что system () вызывает оболочку, которая не поддерживает &>, и поэтому интерпретирует ее как "&"с последующим ">".Задержка заставляет вашу программу ждать достаточно долго, чтобы tar завершил работу.

Исправление заключается в изменении вашей команды для использования синтаксиса, поддерживаемого вашей оболочкой.Выдача вывода ошибки из tar, вероятно, ошибка в любом случае.

1 голос
/ 20 декабря 2011

Вот что я бы попробовал:

  1. fork / exec tar самостоятельно, и ваш родитель должен собрать tar-child.Если система вводит условие состязания с файловой системой, может помочь управление созданием / сбором дочернего процесса.

  2. touch пустой файл (fopen для записи и close) и затем tar в новый файл.

  3. Дайте tar опцию --verify;файл должен существовать для проверки:)

...