Создание процесса с индивидуальными настройками

Тема в разделе "LANGS.C", создана пользователем denisznu, 20 май 2009.

  1. denisznu

    denisznu New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2008
    Сообщения:
    15
    Всем привет! Есть такая задача:
    Заставьте консольный процесс запустить несколько своих копий (и далее рекурсивно). Убедитесь, что порождение процессов не будет бесконечным (остановитесь на 4 уровнях максимум). Для каждого процесса создать свое окно консоли с индивидуальными настройками.

    Вопрос такой: как мне для каждого окна сделать разные настройки(например одно окно синего, другое зеленого цвета)? У меня сейчас получаеться только одинаковые....Код приведет ниже.
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. int main(int argc, char **argv)
    5. {
    6.   PROCESS_INFORMATION  pi;
    7.   STARTUPINFO  si;
    8.   int i;
    9.   char cmdline[256];
    10.  
    11.   si.cb             = sizeof(si);
    12.   si.lpReserved     = NULL;
    13.   si.lpDesktop      = NULL;
    14.   si.lpTitle        = "my process";
    15.   si.dwX            = rand()%500;
    16.   si.dwY            = 10;
    17.   si.dwXSize        = 800;
    18.   si.dwYSize        = 300;
    19.   si.dwXCountChars  = 80;
    20.   si.dwYCountChars  = 100;
    21.   si.dwFillAttribute= 350;
    22.   si.dwFlags        = STARTF_USEFILLATTRIBUTE|STARTF_USEPOSITION|STARTF_USESIZE;
    23.   si.wShowWindow    = SW_SHOW;
    24.   si.cbReserved2    = 0;
    25.   si.lpReserved2    = NULL;
    26.   si.hStdInput      = NULL;
    27.   si.hStdOutput     = NULL;
    28.   si.hStdError      = NULL;
    29.  
    30.   if (argc < 2) {
    31.     printf("I am parent\n");
    32.     for(i=1; i<5; i++) {
    33.       sprintf(cmdline, "%s %d", argv[0], i);
    34.       CreateProcess(argv[0], cmdline, NULL, NULL, TRUE,CREATE_NEW_CONSOLE|NORMAL_PRIORITY_CLASS, NULL, NULL,si1, &pi);
    35.       CloseHandle(pi.hProcess);
    36.       CloseHandle(pi.hThread);
    37.     }
    38.   } else {
    39.     printf("I am slave number %s\n", argv[1]);
    40.     getchar();
    41.   }
    42.   return 0;
    43. }
     
  2. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    А где такие бредовые задачи раздают?
     
  3. denisznu

    denisznu New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2008
    Сообщения:
    15
    Не поверишь в универе=) Сам в шоке)))) Есть идеи?
     
  4. denisznu

    denisznu New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2008
    Сообщения:
    15
    Я вод думаю создать несколько стурктур STARTUPINFO, и потом где создаеться процесс сделать что-то типа
    Код (Text):
    1. if(rand()%10<5)
    2. {
    3.              Создаем процесс с 1 стрктурой;
    4. }
    5. else {
    6.               Создаем процесс с 2 стрктурой;
    7. }
    Что вы подскажите?)
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Создать filemapping для межпроцессного обмена данными и в нём хранить:
    1. счётчик созданных процессов
    2. таблицы в произвольной форме с запланированными параметрами
    Процесс проверяет создан ли уже filemapping, если нет не создаёт и заполняет его, если создан, то используя счётчик процессов как индекс выбирает нужные параметры из таблиц и увеличивает счётчик.
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    если нет то создаёт и заполняет его

    Верните редактирование !!! :))
     
  7. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Зачем заморачиваться в filemapping'ом?
    Можно в параметрах командной строки передать уровень вложенности процесса и атрибуты для его консоли.
    Всё.
     
  8. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Вот к примеру.
    Атрибуты консоли случайные, если нужны конкретные - можно через командную строку передавать так же как и степень вложенности.

    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. int main(int argc, char **argv)
    5. {
    6.   int i;
    7.   char cmdline[256];
    8.   STARTUPINFO  si;
    9.   PROCESS_INFORMATION  pi;
    10.  
    11.   srand(time(0));
    12.  
    13.   if (argc < 2) {
    14.     printf("I am parent\n");
    15.     for(i=4; i; i--) {
    16.       si.cb             = sizeof(si);
    17.       si.lpReserved     = NULL;
    18.       si.lpDesktop      = NULL;
    19.       si.lpTitle        = "my process";
    20.       si.dwX            = rand()%500;
    21.       si.dwY            = 10;
    22.       si.dwXSize        = 800;
    23.       si.dwYSize        = 300;
    24.       si.dwXCountChars  = 80;
    25.       si.dwYCountChars  = 100;
    26.       si.dwFillAttribute= rand() & 0xFF;
    27.       si.dwFlags        = STARTF_USEFILLATTRIBUTE|STARTF_USEPOSITION|STARTF_USESIZE;
    28.       si.wShowWindow    = SW_SHOW;
    29.       si.cbReserved2    = 0;
    30.       si.lpReserved2    = NULL;
    31.       si.hStdInput      = NULL;
    32.       si.hStdOutput     = NULL;
    33.       si.hStdError      = NULL;
    34.  
    35.       sprintf(cmdline, "%s %d", argv[0], i);
    36.       CreateProcess(argv[0], cmdline, NULL, NULL, TRUE,CREATE_NEW_CONSOLE|NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
    37.       CloseHandle(pi.hProcess);
    38.       CloseHandle(pi.hThread);
    39.     }
    40.   } else {
    41.     printf("I am slave number %s\n", argv[1]);
    42.     getchar();
    43.   }
    44.   return 0;
    45. }
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    SetConsoleTextAttributes или както так апишка была
     
  10. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Так в CreateProcess в STARTUP_INFO есть поле атрибутов консоли.
    Вообще смотря что надо.
    Если атрибуты должен устанавливать родитель - то CreateProcess+STARTUP_INFO.dwFillAttribute, если сам потомок - то SetConsoleTextAttribute.
    Только SetConsoleTextAttribute будет влиять на выводимый после неё текст, чтобы закрасить всю консоль фоном её прийдётся пробелами заполнять.
    В общем через STARTUP_INFO удобнее.
     
  11. denisznu

    denisznu New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2008
    Сообщения:
    15
    Всес спасибо, теперь необходимо было рекурсивно создать 4 процесса.
    Для этого я использовал файл: в файле лежит число, каждый новый процесс увеличивает его на 1 если оно еще не 5,если в файле уже 5 ...то процессы не создаются.
    Для этого необходимо использовать Мьютексы, что бы в файл не писал процесс 1, когда другой читает из файла..
    У меня не получается их написать, я написал, но программа работает не коректно, создает только два процессса.
    Помогите пожалуйсто.

    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3. #include <iostream.h>
    4.  
    5.  
    6.  
    7. int main(int argc, char **argv)
    8. {
    9.   PROCESS_INFORMATION  pi;
    10.   STARTUPINFO  si;
    11.   int i=0;
    12.   int tmp;
    13.   int process_num=5;
    14.  
    15.   HANDLE hmutex;
    16.   hmutex = CreateMutex(0,FALSE,"MyMutex");//ÌÜÞÒÅÊÑ
    17.   if(GetLastError() == ERROR_ALREADY_EXISTS){//åñëè çàíÿò òî æäåì
    18.       WaitForSingleObject(hmutex,0);
    19.     }
    20.   else{ //åñëè íåò ïèøåì ÷èòàåì ñ ôàéëà óâåëè÷èâàåì ÷èñëî çàïèñûâàåì â ôàéë è îñâîáîæäàåì ìüþòåêñ
    21.   FILE *f;
    22.   f = fopen("D:\\1.txt","r+");
    23.   si.cb             = sizeof(si);
    24.   si.lpReserved     = NULL;
    25.   si.lpDesktop      = NULL;
    26.   si.lpTitle        = "my process";
    27.   si.dwX            = rand()%500;
    28.   si.dwY            = 10;
    29.   si.dwXSize        = 800;
    30.   si.dwYSize        = 300;
    31.   si.dwXCountChars  = 80;
    32.   si.dwYCountChars  = 100;
    33.   si.dwFillAttribute= 1;
    34.   si.dwFlags        = STARTF_USEFILLATTRIBUTE|STARTF_USEPOSITION|STARTF_USESIZE;
    35.   si.wShowWindow    = SW_MAXIMIZE;
    36.   si.cbReserved2    = 0;
    37.   si.lpReserved2    = NULL;
    38.   si.hStdInput      = NULL;
    39.   si.hStdOutput     = NULL;
    40.   si.hStdError      = NULL;
    41.  
    42. //ñ÷èòûâàåì ÷èñëî
    43.  
    44. char line[100], *result;
    45. result = fgets(line, 100, f);
    46. fclose(f);
    47. tmp = atoi(result);
    48.  
    49. // ñîçäàåì ïðîöåññ //
    50. if(tmp<process_num){
    51. cout<<"I am "<<tmp<<" process"<<endl;
    52. CreateProcess(argv[0], NULL, NULL, NULL, TRUE,CREATE_NEW_CONSOLE|NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
    53. }
    54. else{
    55.     cout<<"Eror, cant create process"<<endl;
    56.     exit(1);
    57. }
    58.  
    59. //óâåëè÷èâàåì ÷èñëî
    60. f = fopen("D:\\1.txt","w");
    61. tmp+=1;
    62. fprintf(f,"%d",tmp);
    63. fclose(f);
    64. ReleaseMutex(hmutex);
    65. getchar();
    66.   }
    67.  
    68.  
    69. return 0;
    70. }
     
  12. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    denisznu
    Жуть. Делай как сказал cppasm.
     
  13. wild89

    wild89 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    15
    Как передать уровень вложенности через cmd???
     
  14. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Легко - добавить № создаваемого процесса в lpCommandLine после пути к запускаемому файлу, а затем в созданном процессе получать номер через GetCommandLine.
    Код (Text):
    1. BOOL WINAPI CreateProcess(
    2.   __in_opt     LPCTSTR lpApplicationName,
    3.   __inout_opt  LPTSTR lpCommandLine,
    4.   __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
    5.   __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
    6.   __in         BOOL bInheritHandles,
    7.   __in         DWORD dwCreationFlags,
    8.   __in_opt     LPVOID lpEnvironment,
    9.   __in_opt     LPCTSTR lpCurrentDirectory,
    10.   __in         LPSTARTUPINFO lpStartupInfo,
    11.   __out        LPPROCESS_INFORMATION lpProcessInformation
    12. );