|
|
|
| знающие люди помогите разобратся вот с такой проблемой : на тестовом сервере в cgi-bin папке находяться 2 скрипта 1.gi и 2.cgi первый принекотором условии должен запускать второй скрипт. оба написаны на с++. из первого скрипта вызов второго осуществляеться через функцию CreateProcess ,после успешного запуска второй скрит должен отослать сообщение о запуске в баузер пользователя.Так вот запуск первого скрипта и запуск второго проходит происходит нормально о чем свидетельствует отладочный ответ первого скрипта и списки процессов в диспечере ,но вот ответ от второго не приходит. Не как не могу сообразить с чем это может быть связанно .
в теле второго цикл типа : wheli(1) { .....} ,его нахождение обусловленно логикой программы и убрать его невозможно, | |
|
|
|
|
автор: ..... (18.08.2010 в 13:03) |
|
|
для: no_exit
(17.08.2010 в 19:16)
| | winAPI ?
что передаётся в CreateProcess параметрами DWORD dwCreationFlags, LPSTARTUPINFO lpStartupInfo ?
помимо CreateProcess() используются какие-нибудь CreateNamedPipe или CreatePipe?
Пробовали запускать из консоли ? | |
|
|
|
|
|
|
|
для: .....
(18.08.2010 в 13:03)
| | да используеться winapi ,сначала пытался без параметров,то есть NULL почти везде,
потом
STARTUPINFO si;
PROCESS_INFORMATION pi;
.....
si.hStdOutput = stdout;
si.hStdInput = stdin;
si.hStdError = stderr;
......
bool Res = CreateProcess(NULL, Buff, NULL, NULL, FALSE,
CREATE_NO_WINDOW(так же использовал NULL
для вывода отладки в косоль), 0, NULL, &si, &pi);
|
приложение консольное CreateNamedPipe или CreatePipe не использовал ,но сделал вывод что сервер ждет от моего приложения ответ ,вот только как его сформулировать не пойму.
но а вообще проблемму решил вызвав 2.cgi из 1.cgi через сокет, хотя хотелось бы всетаки с CreateProcess. | |
|
|
|
|
автор: ..... (20.08.2010 в 01:14) |
|
|
для: no_exit
(20.08.2010 в 00:02)
| | такие stdout, stdin, stderr вроде и так присутствуют в STARTUPINFO заполненной GetStartupInfo()
а просто в консоли запускали?
Как я понял независимо от того что не добавлен флаг DETACHED_PROCESS родительская консоль может не наследоваться. Видимо ваш cpp-компилятор лепит какое-нибудь AllocConsole :)
у меня например такая консоль интересно себя ведёт :) если (раз/за)комментировать (Alloc/Attach)Console при запуске из cmd
(просто коммандой>test.cgi)
//<?C--
// просто C, никакого _UNICODE в диррективах препроцессору
#pragma comment(linker, "/ENTRY:EntryPoint")
#define _WIN32_WINNT 0x0500
#include <windows.h>
int WConsole(char*, ...);
void xErrorMsg(char*, BOOL);
char* sTmpBuf;
DWORD dTmp;
HANDLE hSTDIN, hSTDOUT, hSTDERR, hConsole;
int EntryPoint(void) {
sTmpBuf = (char*) HeapAlloc(GetProcessHeap(), 0, 1024);
if (AttachConsole( ATTACH_PARENT_PROCESS ) == 0)
xErrorMsg("AttachConsole", TRUE);
// if (AllocConsole() == 0)
// xErrorMsg("AllocConsole", TRUE);
xErrorMsg("OK", FALSE);
hSTDIN = GetStdHandle( STD_INPUT_HANDLE );
if (hSTDIN == INVALID_HANDLE_VALUE)
xErrorMsg("GetStdHandle( STD_INPUT_HANDLE )", TRUE);
hSTDOUT = GetStdHandle( STD_OUTPUT_HANDLE );
if (hSTDOUT == INVALID_HANDLE_VALUE)
xErrorMsg("GetStdHandle( STD_OUTPUT_HANDLE )", TRUE);
hSTDERR = GetStdHandle( STD_ERROR_HANDLE );
if ( hSTDERR == INVALID_HANDLE_VALUE)
xErrorMsg("GetStdHandle( STD_ERROR_HANDLE )", TRUE);
xErrorMsg("в первых GetLastError() какая-то левая ошибка", FALSE);
if (WConsole("HelloWorld %i %i %i\r\n", hSTDIN, hSTDOUT, hSTDERR) == 0)
xErrorMsg("WConsole failed", FALSE);
else xErrorMsg("OK", FALSE);
FreeConsole();
return 0;
}
int WConsole(char* format, ...) {
int i=0;
va_list args = NULL;
va_start(args, format);
i = wvsprintf(sTmpBuf, format, args);
va_end(args);
WriteFile(hSTDOUT, sTmpBuf, i, &dTmp, 0);
return i;
}
void xErrorMsg(char* lpszF, BOOL fX)
{
DWORD dw = GetLastError();
FormatMessage(
// FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dw,
LANG_NEUTRAL,
sTmpBuf+724,
300, NULL );
wsprintf(sTmpBuf,
"%s\r\n Код ошибки %d ( %#08lx ) \r\n\r\n %s "
, lpszF, dw, dw, sTmpBuf+724);
MessageBox(NULL, sTmpBuf, lpszF, MB_OK);
if (fX) ExitProcess(0);
}
|
а cmd похоже тоже типа CreateProcess что-то использует.
//apache с такими AllocConsole() запускает нормально | |
|
|
|
|
автор: ..... (20.08.2010 в 01:29)  3.9 Кб |
|
|
для: .....
(20.08.2010 в 01:14)
| | забыл сказать что msvc_8
//прикрепил ехе (забыл включить оптимизацию :)) | |
|
|
|
|
|
|
|
для: .....
(20.08.2010 в 01:29)
| | огромное спасибо за пример ,попробую его на практике.
у меня ms visual studio 2008, вприципе я доволен ,но есть мелкие глюки(по моему мненю). | |
|
|
|
|
автор: ..... (20.08.2010 в 09:51) |
|
|
для: no_exit
(20.08.2010 в 02:58)
| | Это был не пример :) я просто сам разбирался , а кода нет , поэтому у меня свой :))
вообще в процессе-родителе наверное должно быть что-то типа
//<?
BOOL x_pipe(char* cmd, int timeout, DWORD dwFlags)
{
HANDLE x_stdout, x_stdin;
SECURITY_ATTRIBUTES sat = { sizeof(sat), NULL, TRUE };
STARTUPINFO sin = {sizeof(sin)};
if (timeout > -1) {
if (!CreatePipe(&x_stdin, &x_stdout, &sat, 0)) {
WConsole("\r\nCreatePipe failed\r\n");
return FALSE;
}
GetStartupInfo(&sin);
sin.hStdOutput = x_stdout;
sin.hStdError = x_stdout;//
sin.hStdInput = x_stdin;
sin.dwFlags = STARTF_USESHOWWINDOW |STARTF_USESTDHANDLES
|STARTF_FORCEOFFFEEDBACK;
sin.wShowWindow = SW_HIDE;
}
if (!CreateProcess(NULL,
cmd,
NULL, // process security attributes
NULL, // primary thread security attributes
TRUE, // handles are inherited
dwFlags, // creation flags
NULL, // use parent's environment if null
NULL, // use parent's current directory
&sin, &pin)) {
WConsole("\r\nCreateProcess failed\r\n");
return FALSE;
}
/*
но с чтением - выводом пока непонял как сделать.
некоторые консольные процессы
даже с timeout > 2000 и всякие PeekNamedPipe не успевают показать весь свой вывод
// дальше тоже просто наброски
*/
if (timeout < 0) return TRUE;
WConsole("выполнение комманды '%s'\r\n", cmd);
CloseHandle(x_stdout);
*(cOutBuf) = '\0';
Sleep((timeout)? timeout: 1000);
while(PeekNamedPipe(
x_stdin, (LPVOID) sTmpBuf, 1024,
NULL, //LPDWORD lpBytesRead,
&dTmp, //LPDWORD lpTotalBytesAvail,
NULL ) //LPDWORD lpBytesLeftThisMessage
&& dTmp ) {
// RtlZeroMemory(sTmpBuf, 1024);
*(sTmpBuf) = '\0';
if (! ReadFile(x_stdin, (LPVOID) sTmpBuf,
dTmp, &dTmp, 0) || dTmp == 0) break;
sTmpBuf[dTmp] = '\0';
Wout(1, -1, "");
}
CloseHandle(x_stdin);
return TRUE;
}
|
| |
|
|
|
|
автор: ..... (20.08.2010 в 10:30) |
|
|
для: no_exit
(20.08.2010 в 02:58)
| | >в теле второго цикл типа : wheli(1)
дочерний процесс потом висит как демон я так понял ? | |
|
|
|
|
автор: ..... (20.08.2010 в 19:58) |
|
|
для: no_exit
(20.08.2010 в 02:58)
| | не сразу заметил
STARTF_USESTDHANDLES Sets the standard input, standard output, and standard error handles for the process to the handles specified in the hStdInput, hStdOutput, and hStdError members of the STARTUPINFO structure. For this to work properly, the handles must be inheritable and the CreateProcess function's bInheritHandles parameter must be set to TRUE. For more information, see Handle Inheritance.
If this value is not specified, the hStdInput, hStdOutput, and hStdError members of the STARTUPINFO structure are ignored.
>TRUE, // handles are inherited | |
|
|
|
|