Форум программистов, компьютерный форум CyberForum.ru

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

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

как это сделать? подскажите, пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2011, 22:50     Взаимодействие процессов
Посмотрите здесь:

C++ Взаимодействие сайтов и VC++
C++ Взаимодействие с железом
Взаимодействие с интернетом C++
C++ Взаимодействие программы и ОС
Взаимодействие с сайтами C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
25.08.2011, 00:38     Взаимодействие процессов #2
SkyDreamer, тут имеет огромное значение операционная система, под которой это делается. Универсальный вариант - связывать процессы через сокеты, однако он же, наверное, самый геморройный. А так - в каждой ОС по-своему. Какая у вас?
SkyDreamer
0 / 0 / 0
Регистрация: 29.06.2010
Сообщений: 35
30.08.2011, 00:13  [ТС]     Взаимодействие процессов #3
Цитата Сообщение от talis Посмотреть сообщение
SkyDreamer, тут имеет огромное значение операционная система, под которой это делается. Универсальный вариант - связывать процессы через сокеты, однако он же, наверное, самый геморройный. А так - в каждой ОС по-своему. Какая у вас?
Винда XP, делается для неё
talis
 Аватар для talis
789 / 541 / 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;
}
Yandex
Объявления
30.08.2011, 15:33     Взаимодействие процессов
Ответ Создать тему
Опции темы

Текущее время: 16:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru