Всем привет! Есть такая задача: Заставьте консольный процесс запустить несколько своих копий (и далее рекурсивно). Убедитесь, что порождение процессов не будет бесконечным (остановитесь на 4 уровнях максимум). Для каждого процесса создать свое окно консоли с индивидуальными настройками. Вопрос такой: как мне для каждого окна сделать разные настройки(например одно окно синего, другое зеленого цвета)? У меня сейчас получаеться только одинаковые....Код приведет ниже. Код (Text): #include <windows.h> #include <stdio.h> int main(int argc, char **argv) { PROCESS_INFORMATION pi; STARTUPINFO si; int i; char cmdline[256]; si.cb = sizeof(si); si.lpReserved = NULL; si.lpDesktop = NULL; si.lpTitle = "my process"; si.dwX = rand()%500; si.dwY = 10; si.dwXSize = 800; si.dwYSize = 300; si.dwXCountChars = 80; si.dwYCountChars = 100; si.dwFillAttribute= 350; si.dwFlags = STARTF_USEFILLATTRIBUTE|STARTF_USEPOSITION|STARTF_USESIZE; si.wShowWindow = SW_SHOW; si.cbReserved2 = 0; si.lpReserved2 = NULL; si.hStdInput = NULL; si.hStdOutput = NULL; si.hStdError = NULL; if (argc < 2) { printf("I am parent\n"); for(i=1; i<5; i++) { sprintf(cmdline, "%s %d", argv[0], i); CreateProcess(argv[0], cmdline, NULL, NULL, TRUE,CREATE_NEW_CONSOLE|NORMAL_PRIORITY_CLASS, NULL, NULL,si1, &pi); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } } else { printf("I am slave number %s\n", argv[1]); getchar(); } return 0; }
Я вод думаю создать несколько стурктур STARTUPINFO, и потом где создаеться процесс сделать что-то типа Код (Text): if(rand()%10<5) { Создаем процесс с 1 стрктурой; } else { Создаем процесс с 2 стрктурой; } Что вы подскажите?)
Создать filemapping для межпроцессного обмена данными и в нём хранить: 1. счётчик созданных процессов 2. таблицы в произвольной форме с запланированными параметрами Процесс проверяет создан ли уже filemapping, если нет не создаёт и заполняет его, если создан, то используя счётчик процессов как индекс выбирает нужные параметры из таблиц и увеличивает счётчик.
Зачем заморачиваться в filemapping'ом? Можно в параметрах командной строки передать уровень вложенности процесса и атрибуты для его консоли. Всё.
Вот к примеру. Атрибуты консоли случайные, если нужны конкретные - можно через командную строку передавать так же как и степень вложенности. Код (Text): #include <windows.h> #include <stdio.h> int main(int argc, char **argv) { int i; char cmdline[256]; STARTUPINFO si; PROCESS_INFORMATION pi; srand(time(0)); if (argc < 2) { printf("I am parent\n"); for(i=4; i; i--) { si.cb = sizeof(si); si.lpReserved = NULL; si.lpDesktop = NULL; si.lpTitle = "my process"; si.dwX = rand()%500; si.dwY = 10; si.dwXSize = 800; si.dwYSize = 300; si.dwXCountChars = 80; si.dwYCountChars = 100; si.dwFillAttribute= rand() & 0xFF; si.dwFlags = STARTF_USEFILLATTRIBUTE|STARTF_USEPOSITION|STARTF_USESIZE; si.wShowWindow = SW_SHOW; si.cbReserved2 = 0; si.lpReserved2 = NULL; si.hStdInput = NULL; si.hStdOutput = NULL; si.hStdError = NULL; sprintf(cmdline, "%s %d", argv[0], i); CreateProcess(argv[0], cmdline, NULL, NULL, TRUE,CREATE_NEW_CONSOLE|NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } } else { printf("I am slave number %s\n", argv[1]); getchar(); } return 0; }
Так в CreateProcess в STARTUP_INFO есть поле атрибутов консоли. Вообще смотря что надо. Если атрибуты должен устанавливать родитель - то CreateProcess+STARTUP_INFO.dwFillAttribute, если сам потомок - то SetConsoleTextAttribute. Только SetConsoleTextAttribute будет влиять на выводимый после неё текст, чтобы закрасить всю консоль фоном её прийдётся пробелами заполнять. В общем через STARTUP_INFO удобнее.
Всес спасибо, теперь необходимо было рекурсивно создать 4 процесса. Для этого я использовал файл: в файле лежит число, каждый новый процесс увеличивает его на 1 если оно еще не 5,если в файле уже 5 ...то процессы не создаются. Для этого необходимо использовать Мьютексы, что бы в файл не писал процесс 1, когда другой читает из файла.. У меня не получается их написать, я написал, но программа работает не коректно, создает только два процессса. Помогите пожалуйсто. Код (Text): #include <windows.h> #include <stdio.h> #include <iostream.h> int main(int argc, char **argv) { PROCESS_INFORMATION pi; STARTUPINFO si; int i=0; int tmp; int process_num=5; HANDLE hmutex; hmutex = CreateMutex(0,FALSE,"MyMutex");//ÌÜÞÒÅÊÑ if(GetLastError() == ERROR_ALREADY_EXISTS){//åñëè çàíÿò òî æäåì WaitForSingleObject(hmutex,0); } else{ //åñëè íåò ïèøåì ÷èòàåì ñ ôàéëà óâåëè÷èâàåì ÷èñëî çàïèñûâàåì â ôàéë è îñâîáîæäàåì ìüþòåêñ FILE *f; f = fopen("D:\\1.txt","r+"); si.cb = sizeof(si); si.lpReserved = NULL; si.lpDesktop = NULL; si.lpTitle = "my process"; si.dwX = rand()%500; si.dwY = 10; si.dwXSize = 800; si.dwYSize = 300; si.dwXCountChars = 80; si.dwYCountChars = 100; si.dwFillAttribute= 1; si.dwFlags = STARTF_USEFILLATTRIBUTE|STARTF_USEPOSITION|STARTF_USESIZE; si.wShowWindow = SW_MAXIMIZE; si.cbReserved2 = 0; si.lpReserved2 = NULL; si.hStdInput = NULL; si.hStdOutput = NULL; si.hStdError = NULL; //ñ÷èòûâàåì ÷èñëî char line[100], *result; result = fgets(line, 100, f); fclose(f); tmp = atoi(result); // ñîçäàåì ïðîöåññ // if(tmp<process_num){ cout<<"I am "<<tmp<<" process"<<endl; CreateProcess(argv[0], NULL, NULL, NULL, TRUE,CREATE_NEW_CONSOLE|NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); } else{ cout<<"Eror, cant create process"<<endl; exit(1); } //óâåëè÷èâàåì ÷èñëî f = fopen("D:\\1.txt","w"); tmp+=1; fprintf(f,"%d",tmp); fclose(f); ReleaseMutex(hmutex); getchar(); } return 0; }
Легко - добавить № создаваемого процесса в lpCommandLine после пути к запускаемому файлу, а затем в созданном процессе получать номер через GetCommandLine. Код (Text): BOOL WINAPI CreateProcess( __in_opt LPCTSTR lpApplicationName, __inout_opt LPTSTR lpCommandLine, __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, __in BOOL bInheritHandles, __in DWORD dwCreationFlags, __in_opt LPVOID lpEnvironment, __in_opt LPCTSTR lpCurrentDirectory, __in LPSTARTUPINFO lpStartupInfo, __out LPPROCESS_INFORMATION lpProcessInformation );