Процеси в системі UNIX

Цей розділ описує виконання однієї програми з іншої Найпростіший спосіб зробити це – звернутися до стандартної бібліотечної функції system, описаної, але засудженої в главі 6 Команда system отримує один аргумент – командний рядок точно в тому вигляді, як вона набрана на терміналі (за винятком символу нового рядка в кінці), і виконує її в підоболонці Якщо командний рядок повинна бути складена з декількох частин, то можуть стати в нагоді можливості форматування в памяті, якими володіє sprintf Наприкінці даного розділу буде представлена ​​більш надійна версія system для використання в інтерактивних програмах, але спочатку треба досліджувати частини, з яких вона складається

Низькорівневе створення процесів – execlp і execvp

Базова операція – це виконання іншої програми без очікування завершення системним викликом execlp Наприклад, щоб надрукувати дату в якості останнього дії виконується програми, використовуйте

execlp(&quotdate&quot, &quotdate&quot,  (char *)  0)

Перший аргумент execlp – це імя файлу команди execlp отримує шлях пошуку (тобто $ PATH) з оточення і здійснює такий же пошук, як оболонка Другий і наступні аргументи – це імя команди і її параметри вони стають масивом argv для нової програми Кінець списку позначений нульовим значенням (щоб зрозуміти конструкцію execlp, зверніться до exec (2))

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

execlp(&quotdate&quot, &quotdate&quot,  (char *)  0)

fprintf(stderr,  &quotCouldnt  execute  date\n&quot), exit(l)

Різновид execlp, іменована execvp, застосовується в тих випадках, коли кількість аргументів заздалегідь не відомо Виклик виглядає так:

execvp(filename, argp)

де argp – це масив покажчиків на аргументи (як argv) останній покажчик в масиві повинен бути NULL, щоб execvp мав можливість визначити, де закінчується список Як і для execlp, filename – Це файл, в якому знаходиться програма, а argp – це масив argv для нової програми argp [0] – це імя програми

Жодна з цих програм не допускає наявності метасимволов <,>, *, лапок і т д у списку аргументів Якщо це необхідно, викликайте допомогою execlp оболонку / bin / sh, яка виконає всю роботу Сформуйте командний рядок, яка буде містити всю команду, як якщо б вона була надрукована на терміналі, потім скажіть:

execlp(&quot/bin/sh&quot, &quotsh&quot, &quot–c&quot, commandline,  (char *)  0)

Аргумент-с визначає, що наступний аргумент повинен розглядатися як ціла командний рядок, а не як окремий аргумент

Розглянемо в якості ілюстрації програму waitfile Команда

$ waitfile імя5файла [команда]

періодично перевіряє вказаний файл Якщо він не змінився з моменту останньої перевірки, то команда виконується Якщо команда не визначена, то файл копіюється на стандартний пристрій виводу Для моніторингу роботи troff ми використовуємо waitfile:

$ waitfile  troffout echo troff done &amp

Реалізація waitfile витягує час редагування файлу за допомогою

fstat

/ * Waitfile: чекає, поки файл не перестане змінюватися * /

#include &ltstdioh&gt

#include &ltsys/typesh&gt

#include  &ltsys/stath&gt char  *progname

main(argc,  argv) int  argc

char  *argv[]

{

int fd

struct  stat  stbuf time_t  old_time  =  0

progname  =  argv[0] if  (argc  &lt  2)

error(&quotUsage: %s  filename  [cmd]&quot,  progname) if ((fd =  open(argv[1], 0))  ==  –1)

error(&quotcant  open  %s&quot,  argv[1]) fstat(fd,  &ampstbuf)

while  (stbufst_mtime  =  old_time)  { old_time  =  stbufst_mtime sleep(60)

fstat(fd, &ampstbuf)

}

if (argc == 2) {/ * копіювати файл * / execlp (cat, cat, argv [1], (char *) 0) error (cant execute cat% s, argv [1])

} Else {/ * запустити процес * / execvp (argv [2], & argv [2])

error(&quotcant execute  %s&quot,  argv[2])

} exit(0)

}

Тут проілюстровані обидва виклику: execlp і execvp

Обраний саме такий підхід, тому що він корисний для розуміння, але прийнятні і інші варіанти Наприклад, waitfile може просто завершуватися, після того як файл перестав змінюватися

Вправа 717Змініть програму watchfile (вправа 712) таким чином, щоб вона мала ті ж властивості, що й waitfile: якщо немає параметра команда, Вона копіює файл в іншому випадку виконує команду Чи можуть watchfile і waitfile спільно використовувати результат ний код Підказка: argv [0] ~

Джерело: Керниган Б, Пайк Р, UNIX Програмне оточення – Пер з англ – СПб: Символ-Плюс, 2003 – 416 с, Мул

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


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

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

Ваш отзыв

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

*

*