Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

Таким образом, можно добиться более-менее системно-независимого поведения

system
. Но если вы хотите запомнить выведенную программой информацию (например, в переменной), то
system
— не лучший способ (см. следующий раздел).

Упомяну еще метод

exec
. Он ведет себя аналогично
system
с тем отличием, что новый процесс замещает текущий. Поэтому код, следующий за
exec
, исполняться не будет.

puts "Содержимое каталога:"

exec("ls", "-l")

puts "Эта
строка никогда не исполняется!"

14.1.2. Перехват вывода программы

Простейший способ перехватить информацию, выведенную программой, — заключить команду в обратные кавычки, например:

listing = `ls -l` # Одна строка будет содержать несколько строчек (lines).

now = `date` # "Mon Mar 12 16:50:11 CST 2001"

Обобщенный ограничитель

%x
вызывает оператор обратных кавычек (который в действительности является методом модуля Kernel). Работает он точно так же:

listing = %x(ls -l)

now = %x(date)

Применение

%x
бывает полезно, когда подлежащая исполнению строка содержит такие символы, как одиночные и двойные кавычки.

Поскольку обратные кавычки — это на самом деле метод (в некотором смысле), то его можно переопределить. Изменим его так, чтобы он возвращал не одну строку, а массив строк. Конечно, при этом мы создадим синоним старого метода, чтобы его можно было вызвать.

alias old_execute `

def `(cmd)

 out = old_execute(cmd) # Вызвать исходный метод обратной кавычки.

 out.split("\n") # Вернуть массив строк!

end

entries = `ls -l /tmp`

num = entries.size # 95

first3lines = %x(ls -l | head -n 3)

how_many = first3lines.size # 3

Как видите, при таком определении изменяется также поведение ограничителя

%x
.

В следующем примере мы добавили в конец команды конструкцию интерпретатора команд, которая перенаправляет стандартный вывод для ошибок в стандартный вывод:

alias old_execute `

def `(cmd)

 old_execute(cmd + " 2>&1")

end

entries = `ls -l /tmp/foobar`

# "/tmp/foobar: No such file or directory\n"

Есть, конечно, и много других способов

изменить стандартное поведение обратных кавычек.

14.1.3. Манипулирование процессами

В этом разделе мы обсудим манипулирование процессами, хотя создание нового процесса необязательно связано с запуском внешней программы. Основной способ создания нового процесса — это метод

fork
, название которого в соответствии с традицией UNIX подразумевает разветвление пути исполнения, напоминая развилку на дороге. (Отметим, что в базовом дистрибутиве Ruby метод
fork
на платформе Windows не поддерживается.)

Метод

fork
, находящийся в модуле
Kernel
(а также в модуле
Process
), не следует путать с одноименным методом экземпляра в классе
Thread
.

Существуют два способа вызвать метод

fork
. Первый похож на то, как это обычно делается в UNIX, — вызвать и проверить возвращенное значение. Если оно равно
nil
, мы находимся в дочернем процессе, в противном случае — в родительском. Родительскому процессу возвращается идентификатор дочернего процесса (pid).

pid = fork

if (pid == nil)

 puts "Ага, я, должно быть, потомок."

 puts "Так и буду себя вести."

else

 puts "Я родитель."

 puts "Пора отказаться от детских штучек."

end

В этом не слишком реалистичном примере выводимые строки могут чередоваться, а может случиться и так, что строки, выведенные родителем, появятся раньше. Но сейчас это несущественно.

Следует также отметить, что процесс-потомок может пережить своего родителя. Для потоков в Ruby это не так, но системные процессы — совсем другое дело.

Во втором варианте вызова метод

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

fork do

 puts "Ага, я, должно быть, потомок."

 puts "Так и буду себя вести."

end

puts "Я родитель."

puts "Пора отказаться от детских штучек."

Конечно, pid по-прежнему возвращается, мы просто не показали его.

Чтобы дождаться завершения процесса, мы можем вызвать метод

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

Поделиться:
Популярные книги

Лекарственные растения. Использование в народной медицине и в быту

Пастушенков Владимир Леонидович
Дом. Дача. Сад. Огород
Дом и Семья:
здоровье и красота
5.00
рейтинг книги
Лекарственные растения. Использование в народной медицине и в быту

Электроника?.. Нет ничего проще!

Эймишен Жан-Поль
885. Массовая радиобиблиотека
Техника:
радиоэлектроника
5.00
рейтинг книги
Электроника?.. Нет ничего проще!

Александр Иванович Шокин. Портрет на фоне эпохи

Коллектив авторов
6. Созидатели отечественной электроники
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Александр Иванович Шокин. Портрет на фоне эпохи

Ермак. Регент

Валериев Игорь
10. Ермак
Фантастика:
попаданцы
альтернативная история
4.80
рейтинг книги
Ермак. Регент

Древние тайны (Сборник)

Булычев Кир
Алиса и ее друзья в лабиринтах истории
Детские:
детская фантастика
6.00
рейтинг книги
Древние тайны (Сборник)

Робин Уильямс. Грустный комик, который заставил мир смеяться

Ицкофф Дэйв
Иконы кино. Биографии великих деятелей кинематографа
Документальная литература:
биографии и мемуары
публицистика
5.00
рейтинг книги
Робин Уильямс. Грустный комик, который заставил мир смеяться

Точка Бифуркации XI

Смит Дейлор
11. ТБ
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Точка Бифуркации XI

"Фантастика 2024-68". Компиляция. Книги 1-22

Фролов Андрей
Фантастика 2024. Компиляция
Фантастика:
фэнтези
боевая фантастика
космическая фантастика
попаданцы
альтернативная история
рпг
5.00
рейтинг книги
Фантастика 2024-68. Компиляция. Книги 1-22

Второгодка. Книга 3. Ученье свет

Ромов Дмитрий
3. Второгодка
Фантастика:
городское фэнтези
сказочная фантастика
альтернативная история
5.25
рейтинг книги
Второгодка. Книга 3. Ученье свет

Печать пожирателя 6

Соломенный Илья
6. Пожиратель
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
фантастика: прочее
5.00
рейтинг книги
Печать пожирателя 6

"Дальние горизонты. Дух". Компиляция. Книги 1-25

Усманов Хайдарали
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Дальние горизонты. Дух. Компиляция. Книги 1-25

Worm

Дж Мак Крей
Фантастика:
боевая фантастика
киберпанк
6.25
рейтинг книги
Worm

Корабль смерти, Стальной человек и другие самые невероятные истории (сборник)

Матесон Ричард
Шедевры фантастики
Фантастика:
научная фантастика
ужасы и мистика
6.80
рейтинг книги
Корабль смерти, Стальной человек и другие самые невероятные истории (сборник)

Стихотворения и поэмы (основное собрание)

Бродский Иосиф Александрович
Поэзия:
поэзия
5.00
рейтинг книги
Стихотворения и поэмы (основное собрание)