Ожидание завершения распаковки перед выполнением кода C++ на машине RedHat.

Я хочу разархивировать заархивированную папку на моем компьютере с Redhat.

Для этого я отправляю скрипту bash строку;

"unzip /usr/bin/Folder.gz"

Это распаковывает папку без проблем, так как я получаю общее

inflating folderA/folderB/fileX

и т.п.


Однако я хочу удерживать код в команде распаковки, ожидая завершения распаковки.

я пытался использовать

sleep(5)

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

Я искал в Интернете, но безрезультатно...

Итак, мой вопрос; Каков надежный способ остановить программу до завершения распаковки?


ОС: Красная шляпа

Язык программирования: С++

IDE: Затмение


person Andy    schedule 08.08.2011    source источник
comment
Как вы отправляете строку - т.е. код C++   -  person mmmmmm    schedule 08.08.2011


Ответы (4)


Как запустить скрипт bash?

Если вы используете system() API, он запустит программу, а затем дождется завершения порожденного процесса.

system() system — это вызов, состоящий из трех других системных вызовов: execl(), wait() и fork(). Источник.

person Anders Abel    schedule 08.08.2011
comment
Я использовал системную команду, как вы предложили. Однако есть много людей, которые говорят, что использование системной команды является табу. Почему так и что делать вместо этого? - person Andy; 11.08.2011
comment
@Энди: Это уместный вопрос, но другой вопрос и этот. Пожалуйста, опубликуйте его как новый вопрос. - person Anders Abel; 11.08.2011

Пытаться:

unzip /usr/bin/Folder.gz &
wait $!

Это заставит оболочку ожидать завершения последнего процесса. PID последней выполненной команды хранится в $!.

Не уверен, как это относится к C++, но если вы хотите сделать то же самое из кода, вы можете использовать функцию waitpid.

Конечно, если вы хотите, чтобы ваша программа блокировалась во время выполнения unzip, я немного не понимаю, в чем именно заключается проблема. Предполагая, что вы используете system или что-то подобное для запуска unzip, он должен блокироваться до завершения команды.

person Louis Marascio    schedule 08.08.2011
comment
Почему бы не использовать просто unzip /usr/bin/Folder.gz без & ? В C++ вы бы просто сделали system("unzip /usr/bin/Folder.gz") (вместо fork/execve/while waitpid) - person Alexandre C.; 08.08.2011
comment
Это правильно, и вскоре после этого я отредактировал свой ответ. У меня сложилось впечатление, что ОП хотел выполнить работу, ожидая завершения unzip, а затем присоединиться к завершению процесса. - person Louis Marascio; 08.08.2011

Я не совсем уверен, что это лучший способ, но он надежный. Теперь вместо того, чтобы просто отправить команду в bash, почему бы не отправить вывод в какой-нибудь файл.

unzip /usr/bin/Folder.gz > output.txt

Прочитайте файл через равные промежутки времени из вашего кода C++ (скажем, 1 секунду), как только вы найдете 100% или что-то еще, что должна содержать последняя строка вывода, а затем продолжите свой код.

person Krunch    schedule 08.08.2011

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

person Andy Hunt    schedule 08.08.2011