Запуск процесса из программы — КиберПедия 

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Запуск процесса из программы

2021-05-27 36
Запуск процесса из программы 0.00 из 5.00 0 оценок
Заказать работу

 

Нас обычно не заботит тот факт, что командный интерпретатор создает процессы — это просто подразумевается. В некоторых прикладных задачах можно положиться на сценарии командного интерпретатора (пакеты команд, записанные в файл), которые сделают эту работу за вас, но в ряде других случаев вы пожелаете создавать процессы самостоятельно.

Например, в большой мультипроцессорной системе вы можете пожелать, чтобы одна главная программа выполнила запуск всех других процессов вашего приложения на основании некоторого конфигурационного файла. Другим примером может служить необходимость запуска процессов по некоторому событию.

Рассмотрим некоторые из функций, которые обеспечивает для запуска других процессов (или подмены одного процесса другим):

· system();

· семейство функций ехес();

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

· fork();

· vfork().

 

Какую из этих функций применять, зависит от двух требований: переносимости и функциональности. Как обычно, между этими двумя требованиями возможен компромисс.

Обычно при всех запросах на создание нового процесса происходит следующее. Поток в первоначальном процессе вызывает одну из вышеприведенных функций. В конечном итоге функция заставит администратор процессов создать адресное пространство для нового процесса. Затем ядро выполнит запуск потока в новом процессе. Этот поток выполнит несколько инструкций и вызовет функцию main().

 

Запуск потока

 

Теперь, когда мы знаем, как запустить другой процесс, давайте рассмотрим, как осуществить запуск другого потока.

Любой поток может создать другой поток в том же самом процессе; на это не налагается никаких ограничений (за исключением объема памяти, конечно!) Наиболее общий путь реализации этого — использование вызова функций pthread_create():

 

#include <pthread.h>

int int

pthread_create (pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

 

Функция pthread_create() имеет четыре аргумента:

 

· thread - указатель на pthread_t, где хранится идентификатор потока;

· attr - атрибутная запись;

· start_routine - подпрограмма, с которой начинается поток;

· arg - параметр, который передается подпрограмме start_routine.

 

Отметим, что указатель thread и атрибутная запись (attr) — необязательные элементы, вы можете передавать вместо них NULL.

Параметр thread может использоваться для хранения идентификатора вновь создаваемого потока. Обратите внимание, что в примерах, приведенных ниже, мы передадим NULL, обозначив этим, что мы не заботимся о том, какой идентификатор будет иметь вновь создаваемый поток.

 

Если бы нам было до этого дело, мы бы сделали так:

 

pthread_t tid;

pthread_create (&tid,...

printf («Новый поток имеет идентификатор %d\n», tid);

 

Такое применение совершенно типично, потому что вам часто может потребоваться знать, какой поток выполняет какой участок кода.

 

Небольшой тонкий момент. Новый поток может начать работать еще до присвоения значения параметру tid. Это означает, что вы должны внимательно относиться к использованию tid в качестве глобальной переменной. В примере, приведенном выше, все будет корректно, потому что вызов pthread_create() отработал до использования tid, что означает, что на момент использования tid имел корректное значение.

Новый поток начинает выполнение с функции start_routine (), с параметром arg.

Атрибутная запись потока

 

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

Прежде, чем мы перейдем к обсуждению задания атрибутов потока, рассмотрим тип данных

Синхронизация

 

Самый простой метод синхронизации — это «присоединение» (joining) потоков. Реально это действие означает ожидание завершения.

Присоединение выполняется одним потоком, ждущим завершения другого потока. Ждущий поток вызывает pthreadjoin():

#include <pthread.h>

int

pthread_join (pthread_t thread, void **value_ptr);

 

Функции pthreadjoin() передается идентификатор потока, к которому вы желаете присоединиться, а также необязательный аргумент value_ptr, который может быть использован для сохранения возвращаемого присоединяемым потоком значения. (Вы можете передать вместо этого параметра NULL).

Где нам брать идентификатор потока?

В функции pthread_create() в качестве первого аргумента указатель на pthread_t. Там и будет сохранен идентификатор вновь созданного потока.

 

2.2.2 Текст программы

 

#include <stdio.h>

#include <pthread.h>

#include <sys/neutrino.h>

 

pthread_t thread_id1;

pthread_t thread_id2;

 

void * long_thread1(void *notused)

{

 int n;

for(n=0;n<5;n++)

{

printf("Eto pervii potok, TID %d - N povtora %d \n", thread_id1, n);

sleep(2);

}

}

 

void * long_thread2(void *notused)

{

 int m;

for(m=0; m<5; m++)

{

printf("Eto vtoroi potok, TID %d - N povtora %d \n", thread_id2, m);

sleep(1);

}

}

 

int main(void)

{

 

printf("Prog threads PID %d \n",getpid());

 

pthread_create(&thread_id1, NULL, long_thread1, NULL);

pthread_create(&thread_id2, NULL, long_thread2, NULL);

 

sleep(40);

 

return(1);

}

2.2.3 Последовательность действий

 

В программе создаются и запускаются на исполнение два потока. Когда один поток приостанавливается, сразу начинает работу другой. Приостановка реализована функцией sleep(n), которая останавливает процесс на n секунд. На экране можно наблюдать, как по очереди работают два процесса.

2.2.4 Результаты

 

# gcc pthread.c

# `pwd`a.out

Prog threads PID 852000

Etot pervii potok, TID 0 - N povtora 0

Etot vtoroi potok, TID 0 - N povtora 0

Etot vtoroi potok, TID 3 - N povtora 1

Etot pervii potok, TID 2 - N povtora 1

Etot vtoroi potok, TID 3 - N povtora 2

Etot vtoroi potok, TID 3 - N povtora 3

Etot pervii potok, TID 2 - N povtora 2

Etot vtoroi potok, TID 3 - N povtora 4

Etot pervii potok, TID 2 - N povtora 3

Etot pervii potok, TID 2 - N povtora 4

#

 


Поделиться с друзьями:

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.019 с.