Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
SkyDreamer
0 / 0 / 0
Регистрация: 29.06.2010
Сообщений: 35
#1

Взаимодействие процессов - C++

24.08.2011, 22:50. Просмотров 1540. Ответов 3
Метки нет (Все метки)

Нужно написать задачу, в которой дано 10 процессов (там P1, P2, …, Р10, например) Функционирование и взаимодействие процессов следующее:
• P1 (запускается пользователем): Запустить процессы P2, Р3, …, Р10. Далее, процесс Р1 следит за количеством подчинённых процессов (т.е. сколько из Р2 – Р10 работают), если какой-то процесс завершается, то Р1 тут же запускает его заново. Иначе говоря, в системе должно постоянно работать 10 процессов.
• P2, Р3, …, Р10 (запускаются процессом P1): каждый процесс выводит на экран время собственного старта, после чего генерирует случайное чисто от 2 до 10 (назовём его Т), выводит Т на экран и засыпает на Т секунд. После этого процесс завершается.

как это сделать? подскажите, пожалуйста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2011, 22:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Взаимодействие процессов (C++):

Взаимодействие процессов, обмен сообщениями через порт - C++
Народ, нужна помощь с лабораторной работой. Нужна вот такая программа на С++: "Вычислить f (x) * g (x), используя 2 вспомогательных...

Взаимодействие VB и VC++ - C++
Взаимодействие VB и VCPP. VB60 и VCPP50. Помогите решить проблемку. Есть VB проект и dll на плюсах. Всё бы хорошо и всё...

Взаимодействие с сайтами - C++
Подскажите пожалуйста, где можно найти нужную литературу для достижения следующей задачи. Мне нужно чтобы программно выполнялись...

Межпроцессное взаимодействие - C++
Здравствуйте. Подскажите пожалуйста, как лучше и проще будет организовать межпроцессное взаимодействие. Есть динамическая библиотека...

Взаимодействие классов - C++
Допустим, в первом классе у нас объявлена какая-либо переменная, например проинициализированная строка, объявленная в секции private. Как в...

Межпроцессорное взаимодействие - C++
Добрый день. Может быть кто знает готовые библиотеки реализующие клиент-сервер (любые, кроме сокетов)?

3
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
25.08.2011, 00:38 #2
SkyDreamer, тут имеет огромное значение операционная система, под которой это делается. Универсальный вариант - связывать процессы через сокеты, однако он же, наверное, самый геморройный. А так - в каждой ОС по-своему. Какая у вас?
0
SkyDreamer
0 / 0 / 0
Регистрация: 29.06.2010
Сообщений: 35
30.08.2011, 00:13  [ТС] #3
Цитата Сообщение от talis Посмотреть сообщение
SkyDreamer, тут имеет огромное значение операционная система, под которой это делается. Универсальный вариант - связывать процессы через сокеты, однако он же, наверное, самый геморройный. А так - в каждой ОС по-своему. Какая у вас?
Винда XP, делается для неё
0
talis
792 / 544 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
30.08.2011, 15:33 #4
Тогда вас могут заинтересовать следующие функции WinAPI:

ShellExecute
CreateProcess
WaitForMultipleObjects

Есть P1 и Pn представлены одним исполняемым файлом, то Pn можно сказать, что он не хостовый процесс (не P1) либо через параметр коммандной строки, либо создав у P1 сервер TCP (на localhost) или DDE, а у Pn пробовать подключаться к этому серверу. Если подключение удачное - то мы Pn, если неудачное - то мы P1.

Ещё вариант: lock-файл. Создаёте пустой файл с определённым именем (как вариант, ProcessSpawner_LockFile) при запуске P1. Если Pn файл существует, то хостовый процесс запущен, и мы - дочерний процесс. Если файл не существует, то мы - хостовый процесс, мы должны создать этот файл и дочерние процессы. При выходе P1 удаляет lock_файл.

Добавлено через 2 часа 4 минуты
Я представляю себе это так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <windows.h>
 
#define MAX_PROCESSES 9
 
const char * lockFileName = "ProcessSpawner_LockFile";
char * myName;
char stop = 0;
 
void parent();
void child();
unsigned startSelf( );
 
HANDLE fd;
 
int main( int argc, char ** argv )
{
    myName = argv[0];
 
    fd = CreateFile( lockFileName, GENERIC_WRITE, 0, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0 );
 
    if( fd != INVALID_HANDLE_VALUE )
       parent();
    else
       child();
 
    return 0;
}
 
/* обработчик закрытия окна консоли, Ctrl+C, Ctrl+Break и т.д. 
   также вызывается для закрытия и удаления lock-файла в случае ошибки */
BOOL sig( DWORD sig )
{
    stop = 1;
 
    CloseHandle( fd );
 
    if( 0 == DeleteFile( lockFileName ) )
        fprintf( stderr, "\nCould not delete the lock file: 0x%x", GetLastError() );
 
    puts( "\nExiting. Please wait..." );
 
    return 1;
}
 
/* основной код родительского процесса */
inline void parent()
{
    puts( "============ PARENT MODE ==============" );
 
    if( !SetConsoleCtrlHandler( sig, 1 ) )
    {
        fprintf( stderr, "Could not set console control handler: 0x%x\n", GetLastError() );
 
        sig( 0 );
        return;
    }
 
    unsigned int restarts[ MAX_PROCESSES ] = {0};
    HINSTANCE proc[ MAX_PROCESSES ];
    unsigned short count = 0;
    char error = 0;
 
    while( count < MAX_PROCESSES )
    {
        proc[count] = startSelf( );
 
        if( proc[count] < 0x20 )
        {
           stop++;
           sig( 0 );
           return;
        }
 
        count++;
    }
 
    while( !stop )
    {
        unsigned i = 0;
 
        putchar( '\r' );
        while( i < MAX_PROCESSES )
        {
            printf( "[%d] ", restarts[i++] );
        }
 
        unsigned result = WaitForMultipleObjects( MAX_PROCESSES, &proc, 0, INFINITY );
 
        if( stop )
           break;
 
        if( result == WAIT_FAILED )
        {
            fprintf( stderr, "\nError while waiting for a process to terminate: 0x%x\n", GetLastError() );
            break;
        }
 
        result -= WAIT_OBJECT_0;
 
        if( result >= MAX_PROCESSES )
        {
            fprintf( stderr, "\nFailed to recreate a child process: 0x%x\n", GetLastError() );
            break;
        }
 
        proc[result] = startSelf( );
        restarts[result]++;
 
        if( proc[result] < 0x20 )
        {
           fprintf( stderr, "\nFailed to recreate a child process: 0x%x\n", GetLastError() );
           break;
        }
    }
 
    if( !stop )
       sig( 0 );
}
 
/* запускает дочерний процесс, открывает его ID с правами на синхронизацию */
unsigned startSelf( )
{
    STARTUPINFO startupInfo;
    PROCESS_INFORMATION procInfo;
 
    memset( &startupInfo, 0, sizeof( startupInfo ) );
    startupInfo.cb = sizeof( startupInfo );
 
    char result = CreateProcess( myName, 0,
                                0, 0,
                                0,
                                CREATE_NEW_CONSOLE, 0, 0, &startupInfo, &procInfo );
 
    if( !result )
    {
        fprintf( stderr, "Could not create a child process: 0x%x\n", GetLastError() );
        return 0;
    }
 
    return OpenProcess( SYNCHRONIZE, 0, procInfo.dwProcessId );
}
 
/* основной код дочернего процесса */
inline void child()
{
    /* дочерние процессы запускаются одновременно,
       по-этому seed от time - не самый лучший вариант.
       от GetCurrentProcess тоже не работает.
       есть идеи? */
    srand( time(0) );
    unsigned w = rand() % 8 + 2;
 
    printf( "Child mode. Waiting for %i seconds\n", w );
 
    Sleep( w * 1000 );
 
    puts( "Bye." );
 
    return;
}
0
30.08.2011, 15:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2011, 15:33
Привет! Вот еще темы с ответами:

Взаимодействие объектов - C++
При написании менеджера объектов для движка столкнулся с проблемой взаимодействия объектов между собой. Например есть классы Player и...

Взаимодействие C++ и Python - C++
Привет! Недавно разговаривал с другом, который учится за границей в сфере информационных технологий(не программирование, что то, связанное...

Взаимодействие плагинов - C++
Приветствую, товарищи. Возникла такая необходимость. Намерен сделать два плагина. Конкретнее, два VST-плагина для звуковых редакторов,...

Взаимодействие классов - C++
Решил потренироваться и написать &quot;игру&quot;. Есть класс игрок и класс бот. Как наладить их взаимодействие? З.Ы. да, я знаю, что в классах нет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru