Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект Лекций ПСРВ.doc
Скачиваний:
81
Добавлен:
12.02.2016
Размер:
2.73 Mб
Скачать

7.3. Программный запуск процессов

Любая нить текущего процесса может выполнить запуск нового процесса. В QNX имеются различные способы программного запуска процессов. Для этих способов существуют соответствующие им функции запуска процесса. Они следующие:

  • функция system();

  • семейство функций exec*();

  • семейство функций spawn*();

  • функция fork();

  • функция vfork().

7.3.1. Функция system()

#include <stdlib.h>

int system(const char *command);

Поведение функции зависит от значения аргумента command. Если command равен NULL, то определяется, имеется ли в системе shell и функция возвращает ноль, если shell отсутствует, или отличное от нуля значение, если присутствует. Если command не равен NULL, то запускается копия shell и ему, через указатель command, передается командная строка для обработки и возвращается результат выполнения shell и статус завершения его выполнения, соответствующей выполненной команде. Если shell не смог загрузиться, то возвращается -1.

Пример:

#include <stdlib.h>

#include <stdio.h>

#include <sys/wait.h>

 

int main( void ){

    int rc;

 

    rc = system("ls");

    if( rc == -1 ) {

      printf( "shell не может запуститься \n" );

    } else {

      printf( "Результат выполнения команды %d\n",

          WEXITSTATUS( rc ) );

    }

    return EXIT_SUCCESS;

  }

Примечание

Макрокоманда int WIFEXITED (int status), определеноя в заглавном файле " sys/wait.h " возвращает значение отличное от нуля, если дочерний процесс завершон exit или _exit.

Функция void _exit (int status) для завершения процесса с состоянием status.

Макрокоманды EXIT_SUCCESS и EXIT_FAILURE, объявленые в файле "stdlib.h" можно использовать для стандартного значения состояния успеха и отказа, соответственно.

7.3.2. Функции семейства exec*()

Существует набор функций семейства exec*(), которые реализуют однотипный способ запуска процессов и отличаются только некоторыми деталями. Особенность запуска процесса этими функциями заключается в следующем. Процесс, вызвавший функцию семейства exec*(), прекращает выполнять текущий программный код и начинает выполнение инструкций нового (указанного в вызове функции) программного модуля. Важно то, что идентификатор процесса - pid, при этом остается прежним. К функциям семейства exec*() относятся функции execl(), execle(), execlp(), execlpe(), execv(), execve(), execvp(), execvpe(). В качестве примера рассмотрим функции execl(), execle() и execv() семейства exec*().

Объявление функции execl() имеет вид:

#include <process.h>

 

int execl( const char * path,

           const char * arg0,

           const char * arg1...,

           const char * argn,

           NULL );

Возвращает -1 в случае ошибки, иначе возвращаемый результат не определен.

 

Пример.

#include <stddef.h>

#include <process.h>

execl( "myprog", "myprog", "ARG1", "ARG2", NULL );

 

Объявление функции execle() имеет вид:

#include <process.h>

 

int execle( const char * path,

            const char * arg0,

            const char * arg1...,

            const char * argn,

            NULL,

            const char * envp[] );

Пример.

 

#include <stddef.h>

#include <process.h>

 

char* env_list[] = { "SOURCE=MYDATA",

             "TARGET=OUTPUT",

             "lines=65",

             NULL

            };

 

execle("myprog","myprog","ARG1", "ARG2", NULL,env_list);

 Окружение для вызываемой программы состоит изх трех переменных окружения: SOURCE, TARGET и lines.

 

Объявление функции execv() имеет вид:

#include <process.h>

int execv( const char *path,char *const argv[] );

Возвращает -1 в случае ошибки, иначе возвращаемый результат не определен.

 

Пример.

 

 

#include <stddef.h>

#include <process.h>

 

char* arg_list[] = { "myprog", "ARG1", "ARG2", NULL };

 

execv( "myprog", arg_list );

 

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