Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с CreateProcess, Проблемы с CreateProcess 
V
    Опции темы
нуп
Дата 31.5.2012, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ботокодер
**


Профиль
Группа: Участник
Сообщений: 987
Регистрация: 22.6.2009
Где: Кременчуг

Репутация: нет
Всего: 33



Есть класс, который вызывает php скрипт(через createProcess), дожидается результата выполнения и закрывает процесс. Но иногда процесс закрывается до того, как php отработает. В чем может быть ошибка?
Код

bool TPhpManager::killProcess()
{
    bool res = false;
    if(proc_id)
    {
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE, proc_id);
        TerminateProcess (hProcess, 0);
        CloseHandle(hProcess);
    }
    return res;
}

string TPhpManager::getOutput(HANDLE pipe_stdout_read)
{
    char buff[1024];
    string s = "";
    DWORD dwRead,tdwLeft, dwAvail;
    while (ReadFile(pipe_stdout_read, buff, sizeof(buff) - 1, &dwRead, NULL) && dwRead != 0 ) {
        buff[dwRead] = '\0';
        s += buff;
    }
    return s;
}

string TPhpManager::createProccess(wstring command)
{
    if(command.length() == 0)
    {
        command = php_command;
    }
    SECURITY_ATTRIBUTES saAttr;
    STARTUPINFO startup;
    PROCESS_INFORMATION process;
    string data = "";
    int result = 1;
    HANDLE pipe_stdout_write, pipe_stdout_read;

    saAttr.bInheritHandle = TRUE;
    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
    saAttr.lpSecurityDescriptor = NULL;

    pipe_stdout_read = pipe_stdout_write = INVALID_HANDLE_VALUE;

    if (CreatePipe(&pipe_stdout_read, &pipe_stdout_write, &saAttr, 0))
    {
        result = 0;
    }

    memset(&startup, 0, sizeof(STARTUPINFO));
    startup.cb         = sizeof(STARTUPINFO);
    startup.dwFlags    = STARTF_USESTDHANDLES;
    startup.hStdOutput = pipe_stdout_write;
    try
    {
        result = CreateProcessW(
            NULL,
            (LPWSTR)command.c_str(),
            &saAttr, &saAttr,
            TRUE,
            DETACHED_PROCESS | CREATE_SUSPENDED,
            NULL,
            NULL,
            (LPSTARTUPINFOW)&startup,
            &process
        );
        proc_id = process.dwProcessId;
        CloseHandle(pipe_stdout_write);
        if(result)
        {
            WaitForSingleObject(process.hProcess, INFINITE);
            ResumeThread(process.hThread);
            data = this->getOutput(pipe_stdout_read);
        }
        CloseHandle(pipe_stdout_read);
    }
    catch(...)
    {
        logger->Add("TPhpManager::createProccess catch error");
    }
    this->killProcess();
    return data;
}

PM MAIL   Вверх
boostcoder
Дата 31.5.2012, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



покажи что возвращает WaitForSingleObject() когда процесс досрочно валится.

Добавлено через 43 секунды
или прога сваливается в catch блок?
PM WWW   Вверх
feodorv
Дата 31.5.2012, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Я чего-то не понимаю...

Цитата(нуп @  31.5.2012,  20:48 Найти цитируемый пост)
        result = CreateProcessW(
  ... CREATE_SUSPENDED...
        );


Цитата(нуп @  31.5.2012,  20:48 Найти цитируемый пост)
            WaitForSingleObject(process.hProcess, INFINITE);
            ResumeThread(process.hThread);

То есть сначала ожидается завершение подвешенного процесса, и лишь потом процесс (главный поток) возобновляется?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
нуп
Дата 31.5.2012, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ботокодер
**


Профиль
Группа: Участник
Сообщений: 987
Регистрация: 22.6.2009
Где: Кременчуг

Репутация: нет
Всего: 33



Вот такое 4294967295

Добавлено через 4 минуты и 10 секунд
Заменил на такое, тоже не помогает
Код

try
    {
        result = CreateProcessW(
            NULL,
            (LPWSTR)command.c_str(),
            &saAttr, 
            &saAttr,
            TRUE,
            DETACHED_PROCESS,// | CREATE_SUSPENDED,
            NULL,
            NULL,
            (LPSTARTUPINFOW)&startup,
            &process
        );
        CloseHandle(pipe_stdout_write);
        if(result)
        {
            DWORD d = WaitForSingleObject(&process.hProcess, INFINITE);
            stringstream ss;
            ss << "WaitForSingleObject result = " << d;
            logger->Add(ss.str());
            proc_id = process.dwProcessId;
            //ResumeThread(process.hThread);
            data = this->getOutput(pipe_stdout_read);
            CloseHandle(pipe_stdout_read);
        }
    }
    catch(...)
    {

    }

PM MAIL   Вверх
boostcoder
Дата 31.5.2012, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



Цитата(нуп @  31.5.2012,  20:28 Найти цитируемый пост)
такое 4294967295

хм.. это же WAIT_FAILED...

PM WWW   Вверх
нуп
Дата 31.5.2012, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ботокодер
**


Профиль
Группа: Участник
Сообщений: 987
Регистрация: 22.6.2009
Где: Кременчуг

Репутация: нет
Всего: 33



А можете привести рабочий пример создания процесса и получения данных? Может я что-то в корне не правильно делаю
PM MAIL   Вверх
boostcoder
Дата 31.5.2012, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



вставь на следующей строке после WaitForSingleObject(), GetLastError(). и покажи что она возвращает.

Добавлено через 41 секунду
Цитата(нуп @  31.5.2012,  20:46 Найти цитируемый пост)
можете привести рабочий пример создания процесса и получения данных?

для начала, покажи результат GetLastError().

PM WWW   Вверх
нуп
Дата 31.5.2012, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ботокодер
**


Профиль
Группа: Участник
Сообщений: 987
Регистрация: 22.6.2009
Где: Кременчуг

Репутация: нет
Всего: 33



WaitForSingleObject result = 4294967295, last error = 6
PM MAIL   Вверх
feodorv
Дата 31.5.2012, 21:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(нуп @  31.5.2012,  21:28 Найти цитируемый пост)
WaitForSingleObject(&process.hProcess, INFINITE);

& зачем?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
нуп
Дата 31.5.2012, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ботокодер
**


Профиль
Группа: Участник
Сообщений: 987
Регистрация: 22.6.2009
Где: Кременчуг

Репутация: нет
Всего: 33



Без него вобще все висит всегда
PM MAIL   Вверх
feodorv
Дата 31.5.2012, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(нуп @  31.5.2012,  23:16 Найти цитируемый пост)
Без него вобще все висит всегда 

 smile Это метод тыка такой?

Виснет поток, ожидающий завершения процесса. Если процесс завершился, а поток всё висит и висит, то будем разбираться.
Процесс точно завершился?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
нуп
Дата 31.5.2012, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ботокодер
**


Профиль
Группа: Участник
Сообщений: 987
Регистрация: 22.6.2009
Где: Кременчуг

Репутация: нет
Всего: 33



Вообще прикол. php собирает несколько файлов в строку через file_get_contents. Если вставить стоку DWORD d = WaitForSingleObject(process.hProcess, INFINITE);, то php виснет намертво. В чем мои косяки?

Цитата(feodorv @  31.5.2012,  22:34 Найти цитируемый пост)
 Это метод тыка такой?

В примере где-то видел

PM MAIL   Вверх
feodorv
Дата 31.5.2012, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(нуп @  1.6.2012,  00:32 Найти цитируемый пост)
php виснет намертво

Ждёт ввода/вывода через пайп? Если без пайпа запускать и руками прибить созданный php-процесс, WaitFor отвисает?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
нуп
Дата 1.6.2012, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ботокодер
**


Профиль
Группа: Участник
Сообщений: 987
Регистрация: 22.6.2009
Где: Кременчуг

Репутация: нет
Всего: 33



Да php отрабатывает. Напишите нубу пример правильного создания процесса и получения данных. 2 дня уже бьюсь с этой фигней

Это сообщение отредактировал(а) нуп - 1.6.2012, 00:05
PM MAIL   Вверх
feodorv
Дата 1.6.2012, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(нуп @  1.6.2012,  01:04 Найти цитируемый пост)
Да php отрабатывает

Не понял. php отрабатывает без пайпов? Тогда не нужны пайпы, судя по приведённому коду.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0549 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.