Створення процесів

Як згадувалося вище, в програмах Java можуть одночасно виконуватися кілька потоків Більшість систем, на яких функціонує середу Java, також підтримують запуск декількох програм Додатки Java можуть викликати нові програми, звертаючись до однієї з двох форм методу Systemexec Кожен успішний виклик exec створює новий обєкт Process, який являє собою працюючу програму Ви можете запросити інформацію про стан процесу і викликати методи, які керують його ходом Існують дві основні форми методу exec:

public Process exec(String[] cmdarray) throws IOException

Виконує в поточній системі команду, задану в обєкті cmdarray, і повертає обєкт Process (описаний нижче), який представляє запущений процес У cmdarray [0] задається імя команди, а в усіх наступних рядках масиву – аргументи

public Process exec(String command) throws IOException

Еквівалентний першій формі exec, в якій елементи масиву зібрані в один рядок і розділені символами-роздільниками Наведемо приклад використання цієї форми exec:

String cmd = “/bin/ls” + opts + “ ” + dir

Process child = RuntimegetRuntime()exec(cmd)

Породжений процес носить назву процесу-нащадка(child process ) За аналогією, що створює процес називається батьком Метод exec повертає обєкт Process для кожного запущеного процесу-нащадка Цей обєкт володіє двома важливими аспектами стосовно процесу-нащадку: по-перше, він містить методи для звернення до вхідного і вихідного потоку процесу-нащадка, а також до його потоку помилок:

public abstract OutputStream getOutputStream()

Повертає потік OutputStream, зєднаний з вхідним потоком процесу-нащадка Дані, записані в цей потік, зчитуються процесом-нащадком в якості вводу Потік є буферизованная

public abstract InputStream getInputStream()

Повертає потік InputStream, зєднаний з вихідним потоком процесу-нащадка Коли процес-нащадок записує вихідні дані, вони можуть читатися з цього потоку Потік є буферизованная

public abstract InputStream getErrorStream()

Повертає потік InputStream, зєднаний з вихідним потоком помилок процесу-нащадка Коли процес-нащадок видає повідомлення про помилки, вони можуть читатися з цього потоку Потік є небуферізованних, щоб гарантувати негайне надходження інформації про помилки

Нижче як приклад наводиться програма, яка зєднує стандартні потоки Java з потоками нового процесу, щоб все введення користувача надходив у вказану програму, а весь її висновок був видний користувачеві:

public static Process UserProg(String cmd)

throws IOException

{

Process proc = RuntimegetRuntime()exec(cmd) plugTogether(Systemin,  procgetOutputStream()) plugTogether(Systemout, procgetInputStream()) plugTogether(Systemerr, procgetErrorStream()) return proc

}

Передбачається, що метод plugTogether зєднує два потоки, читаючи дані з одного з них і записуючи їх в іншій

Вправа 141

Напишіть метод plugTogether Підказка: скористайтеся багатопотокової моделлю

Другий аспект взаємин між процесом-батьком і процесом-нащадком полягає в тому, що обєкт Process містить методи для управління процесом і визначення його статусу:

public abstract int waitFor() throws InterruptedException

Як завгодно довго очікує завершення процесу-нащадка і повертає значення, передане їм методу Systemexit або його аналогу (нуль означає успішне завершення, все інше – невдачу) Якщо процес вже завершився, то просто повертається значення

public abstract int exitValue()

Повертає завершальний код даного процесу Якщо процес ще активний, то exitValue

збуджує виняток IllegalStateException public abstract void destroy()

Знищує процес Нічого не робить, якщо процес вже завершився Якщо обєкт

Process буде знищений складальником сміття, це НЕ означає знищення самого процесу просто надалі ви не зможете контролювати його

Наприклад, наступний метод повертає строковий масив, який містить результати роботи команди ls із заданими параметрами У разі невдалого завершення команди збуджується виключення LSFailedException:

/ / Javaio * і javautil * Імпортовані

public String[] ls(String dir, String opts)

throws LSFailedException

{

try {

/ / Запустити процес

String[] cmdArray = { &quot/bin/ls&quot, opts, dir }

Process child = RuntimegetRuntime()exec(cmdArray) DataInputStream

in = new DataInputStream(childgetInputStream())

/ / Прочитати вихідні дані Vector lines = new Vector () String line

while ((line = inreadLine()) = null)

linesaddElement(line)

if (childwaitFor () = 0) / / якщо виконання ls

/ / Було невдалим

throw new LSFailedException(childexitValue()) String[] retval = new String{linessize()] linescopyInto(retval)

return retval

} catch (LSFailedException e) {

throw e

} catch (Exception e) {

throw new LSFailedException(etoString())

}

}

Клас Process є абстрактним Кожна реалізація Java повинна містити один або кілька класів, що розширюють Process, які можуть взаємодіяти з

процесами на рівні операційної системи Такі класи можуть володіти розширеним

набором функцій, корисних для програмування в даному середовищі Інформація про розширених функціях повинна міститися в документації

Дві інші форми exec дозволяють задати набір змінних середовища (environment variables

) – Системно-залежних змінних, доступних для нового процесу Змінні середовища передаються методу exec у вигляді строкового масиву, кожен елемент якого задає імя і значення змінної середовища у формі імя = значення Імя не може містити пропусків, хоча значення може бути довільним Змінні середовища передаються другим параметром:

public Process exec(String command, String[] env)

throws IOException

public Process exec(String[] command, String[] env)

throws IOException

Спосіб інтерпретації змінних середовища процесом-нащадком є ​​системно-залежним Механізм змінних середовища підтримується тому, що він існує на самих різних платформах Для передачі інформації між Java-програмами слід користуватися властивостями, а не змінними середовища

Вправа 142

Напишіть програму, яка виконує exec для аргументів, переданих в командному рядку, і виводить результати роботи, причому кожному рядку передує її номер

Вправа 143

Напишіть програму, яка виконує exec для аргументів, переданих в командному рядку, і виводить результати, припиняючи роботу процесу, коли на виході зявляється заздалегідь визначена рядок

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*