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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Среда разработки на Symbian 9.1 http://www.cyberforum.ru/cpp-beginners/thread345087.html
Доброго времени суток. У меня есть старый Nokia E61(qwerty с Os 9.1). Так вот, суть: Я хочу заниматься кодингом когда PC не рядом. Есть ли под среды symbian? (С++) КОМПИЛЯЦИЯ НЕ ОБЯЗАТЕЛЬНА,...
C++ НОК для N чисел //--------------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> ... http://www.cyberforum.ru/cpp-beginners/thread345081.html
C++ Принятие русского шрифта в консоли
Здрасте! Я написал програму, которая должна использовать русский шрифт, но она его не распознает. Для того, что бы она отображала русский текст, я добавил команду setlocale( LC_ALL,"Russian" ); но...
C++ Переменные среды Windows
Как в c++ использовать переменные среды windows? Например я хочу открыть текстовый файл в каталоге C:\documents and settings\user\1.txt Переменная среда данного каталога выглядит вот так:...
C++ Набор для программирования http://www.cyberforum.ru/cpp-beginners/thread345053.html
Доброе время суток. Я хочу написать программу на С++. И затем продать ее. У меня нет денег покупать IDE,потому хочу отдельно взять компилятор, отдельно набор классов для GUI и т.д. Подскажите,...
C++ Сформировать массив из элементов матрицы Дан двумерный массив. Сформировать одномерный массив,каждый элемент которого равен количеству элементов соответствующего столбца двумерного массива,больших числа n подробнее

Показать сообщение отдельно
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
30.08.2011, 15:33
Тогда вас могут заинтересовать следующие функции 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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru