Как я могу запускать несколько команд в одном и том же подпроцессе? [Дубликат]

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

Его документацию можно найти по адресу: http://docs.jboss.org/hibernate/orm/5.0/userguide /html_single/Hibernate_User_Guide.html#caching-query

0
задан Shepmaster 24 July 2016 в 19:46
поделиться

1 ответ

Command::new - это действительно путь, но он предназначен для выполнения программы. ls ; sleep 1; ls не является программой, это инструкции для некоторой оболочки. Если вы хотите выполнить что-то подобное, вам нужно попросить оболочку интерпретировать это для вас:

Command::new("/usr/bin/sh").args(&["-c", "ls ; sleep 1; ls"])
// your complex command is just an argument for the shell

Чтобы получить выход, существует два способа:

  • метод output блокирует и возвращает выходы и статус выхода команды.
  • метод spawn блокировки и возвращает дескриптор, содержащий дочерний процесс stdin, stdout и stderr, чтобы вы могли общаться с дочерним элементом, и метод wait , чтобы дождаться его завершения. Обратите внимание, что по умолчанию дочерний элемент наследует свой родительский дескриптор файла, и вы можете вместо этого настроить каналы:

Вы должны использовать что-то вроде:

let child = Command::new("/usr/bin/sh")
                .args(&["-c", "ls  sleep 1 ls"])
                .stderr(std::process::Stdio::null()) // don't care about stderr
                .stdout(std::process::Stdio::piped()) // set up stdout so we can read it
                .stdin(std::process::Stdio::piped()) // set up stdin so we can write on it
                .spawn().expect("Could not run the command"); // finally run the command

write_something_on(child.stdin);
read(child.stdout);
4
ответ дан mcarton 19 August 2018 в 05:20
поделиться
  • 1
    Спасибо, я прокомментировал строки, содержащие piped() или null(), потому что я хочу использовать дескрипторы файла родителя. – x4rkz 24 July 2016 в 12:01
  • 2
    Поскольку Command следует за шаблоном построителя, немного более идиоматично структурировать его следующим образом: play.rust-lang.org/… – Nate Mara 25 July 2016 в 14:51
  • 3
    @NateMara На самом деле я изначально написал gist.github.com/2c21ce9e7b919b30cb1444548dc897d9 , и был весьма удивлен, что вместо self требуется &mut self. В любом случае, вы правы, я отредактирую свой ответ, спасибо. – mcarton 25 July 2016 в 14:58
  • 4
    Я думаю, что большинство строителей используют &mut self. – Nate Mara 25 July 2016 в 15:00
  • 5
    Может быть, я действительно не обращал на это внимания. С self существует огромная вероятность того, что люди, не обращая внимания, напишут builder.foo(); builder.bar();, игнорируя результат, так что это может быть причиной. Однако это можно было бы решить с помощью аннотации must_use. Не знаю, я был просто удивлен там на мгновение. – mcarton 25 July 2016 в 15:08
Другие вопросы по тегам:

Похожие вопросы: