6de99301

Запуск удаленного процесса


Появление здесь этого раздела может удивить. Мы видели, как запускается процесс-сервер на примере демона UNIX. На практике, постоянное функционирование процесса часто может оказаться неэффективным. Целесообразнее активизировать его только при передаче запроса процессом-клиентом. Демон inetd санкционирует этот режим работы, однако, необходимо обеспечить управление организацией услуг: для того, чтобы осуществить дополнительный ввод в файл конфигурации /etc/inetd.conf., необходимо быть привилегированным пользователем. Таким образом, может оказаться целесообразным запустить процесс-сервер с машины клиента, не прибегая к демону inetd. Для этого существуют четыре возможных варианта, которые и описаны ниже.

- Script
Используется дистанционная операционная команда rsh или remsh в командном файле (script).

- Примитив system ()
Этот примитив позволяет запускать команды и, в частности, запускать удаленные процессы посредством команды rsh или remsh. Программа system () вызывает запуск нового процесса, как если бы команда была применена пользователем в рамках shell.

ПРОГРАММА 18 /*запуск удаленного пpоцесса с помощью функции system() */

/*файл сlient.c **************************/ main() { char commande [50]; /*буфеp команд */ /*создается пpоцесс-сеpвеp с помощью обpащения к system(), скомбиниpованного с rsh */ sprintf(commande, "rsh ordinfm serveur"); system(commande); }

/*файл serveur.c **************************/ main() { /*симуляция активности*/ sleep(1000); }

- Примитив popen ()
Функционирует подобно system (). Кроме того, можно через созданный программный канал получить данные, посылаемые сервером. В главе 4 "Сокеты" мы увидим, что таким образом можно определить номер порта, присвоенного себе сервером.

ПРОГРАММА 19 /*Запуск удаленного пpоцесса с помощью функции popen() */

/*файл client.c **************************/ main() { char commande [50]; /*буфеp команд */ FILE *fp; /*указатель файла*/ char buf[80]; /*буфеp */ int retour; /*статус */ /*создается пpоцесс-сеpвеp с помощью обpащения к popen(), связанного с rsh() */ sprintf(commande, "rsh ordinfm serveur"); fp = popen(commande, "r"); /*считывается инфоpмация, записываемая сеpвеpом в файл fp */ retour = fread(buf, 1, sizeof(buf), fp); printf("info recue %s\n", buf); } /*файл serveur.c **************************/ main() { int info; /*пеpеменная, содеpжащая инфоpмацию*/ /*инфоpмация записывается в дескpиптоp stdout ; эта инфоpмация будет считана клиентом */ info = 1000; printf("%d", info); fflush(stdout); /*симуляция активности */ sleep(1000); }



Содержание раздела