2015-04-22 3 views
0

Моя программа на C++ вызывает другую программу через system(). Эта программа записывает файл. Я не могу изменить вызываемую программу.Файл, читаемый после вызова системы()

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

Как заставить вызванную программу закончить запись до того, как моя программа попытается прочитать? Или, может быть, может ли вызывающая программа проверить, что файл закончен?

Я переключился на system() с fork/execv и CreateProcess специально, чтобы программа блокировалась, и мне не пришлось бы следить за прекращением. Поэтому я мог бы вернуться, если это поможет.

Прямо сейчас, моей единственной идеей было бы удалить файл перед вызовом system() - таким образом, он не существовал бы, если письмо не было завершено.

Любое решение должно иметь версии для Mac, Windows и Linux.

+0

Не используйте 'system()'. Это зло. – Qix

+0

Ваша система() вызывает вашу программу напрямую? Выполняет ли программа свою задачу в одном и том же процессе (против порождения отрывного процесса и т. Д.)? system() блокирует до выхода подпроцесса; любые сделанные им обновления файлов должны быть видны родителям. – seand

+0

Мой вызов system() вызывает программу напрямую - программа ничего не делает. Просто один процесс, который пишет простой текстовый файл и выходит. Я согласен, что любые изменения должны быть видны - вот почему я использовал system() - но это не сработало. Если я подожду короткое время и откройте его, я получу желаемое поведение. – user52485

ответ

0

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

+0

fork/exec применяется к linux и os x, но не к окнам. – seand

+0

вы можете использовать систему в окнах. который ждет, пока дочерний процесс завершит –

+0

system() в окнах, да, но не fork/exec. Windows имеет совершенно другую модель создания процесса; не основанный на клонировании родителя. – seand

0

Насколько я знаю, если вы попытаетесь открыть файл не в режиме чтения, но в режиме записи он не сработает, если файл уже написан другим процессом.

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

Я не уверен, как все работает на Mac, но я предполагаю, что он будет таким же, как Linux и Windows здесь.

Было бы гораздо лучше использовать fork и exec вместо системы, поэтому мое предложение является простым способом (но не рекомендуется для важного проекта), чтобы обойти проблему.

+0

Спасибо за это предложение, я попробую добавить цикл wait(), который откроет файл для записи, чтобы обнаружить это ... Если это работает, оно должно работать для подхода fork/exec так же, как и для подхода system() , Я дам вам знать, как это работает. – user52485

+0

Я предполагаю, что даже при использовании подхода fork/exec OS может занять некоторое время, чтобы закрыть файл, поэтому все же может оказаться полезным поставить этот цикл ожидания. – meneldal

+0

Ну, fopen (fname, "w") всегда преуспевает, выполнение программы пролетает прямо, и загружается старая версия файла. Программа работает с usleep (10000), но без нее. Никакой цикл не нужен, просто спать один раз.Я не возражаю против ожидания, но он чувствует себя очень хрупким. Сколько задержки достаточно? Что происходит, когда компьютеры быстрее? и т. д. – user52485

Смежные вопросы