Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Apache

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: запуск однлго cgi срипта из другого под apache2
 
 автор: no_exit   (17.08.2010 в 19:16)   письмо автору
 
 

знающие люди помогите разобратся вот с такой проблемой : на тестовом сервере в 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?
Пробовали запускать из консоли ?

  Ответить  
 
 автор: no_exit   (20.08.2010 в 00:02)   письмо автору
 
   для: .....   (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);

charsTmpBuf;
DWORD dTmp;
HANDLE hSTDINhSTDOUThSTDERRhConsole;

int EntryPoint(void) {
    
sTmpBuf = (char*) HeapAlloc(GetProcessHeap(), 01024);

    if (
AttachConsoleATTACH_PARENT_PROCESS ) == 0)
        
xErrorMsg("AttachConsole"TRUE);
//    if (AllocConsole() == 0)
//        xErrorMsg("AllocConsole", TRUE);

    
xErrorMsg("OK"FALSE);

    
hSTDIN =  GetStdHandleSTD_INPUT_HANDLE );
    if (
hSTDIN == INVALID_HANDLE_VALUE)
        
xErrorMsg("GetStdHandle( STD_INPUT_HANDLE )"TRUE);
    
hSTDOUT GetStdHandleSTD_OUTPUT_HANDLE );
    if (
hSTDOUT == INVALID_HANDLE_VALUE)
        
xErrorMsg("GetStdHandle( STD_OUTPUT_HANDLE )"TRUE);
    
hSTDERR GetStdHandleSTD_ERROR_HANDLE );
    if ( 
hSTDERR == INVALID_HANDLE_VALUE)
        
xErrorMsg("GetStdHandle( STD_ERROR_HANDLE )"TRUE); 

    
xErrorMsg("в первых GetLastError() какая-то левая ошибка"FALSE);

    if (
WConsole("HelloWorld %i %i %i\r\n",  hSTDINhSTDOUThSTDERR) == 0)
        
xErrorMsg("WConsole failed"FALSE);
    else 
xErrorMsg("OK"FALSE);

    
FreeConsole();
    return 
0;
}

int WConsole(charformat, ...) {
    
int i=0;
    
va_list args NULL;
    
va_start(argsformat);
    
wvsprintf(sTmpBufformatargs);
    
va_end(args);
    
WriteFile(hSTDOUTsTmpBufi, &dTmp0);
    return 
i;
}

void xErrorMsg(charlpszFBOOL fX
{
    
DWORD dw GetLastError();
    
FormatMessage(
        
// FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        
FORMAT_MESSAGE_FROM_SYSTEM |
        
FORMAT_MESSAGE_IGNORE_INSERTS,
        
NULL,
        
dw,
        
LANG_NEUTRAL,
        
sTmpBuf+724,
        
300NULL );
    
wsprintf(sTmpBuf,
       
"%s\r\n  Код ошибки %d ( %#08lx ) \r\n\r\n  %s "
      
lpszFdwdwsTmpBuf+724);

    
MessageBox(NULLsTmpBuflpszFMB_OK); 
    if (
fXExitProcess(0);
}

а cmd похоже тоже типа CreateProcess что-то использует.
//apache с такими AllocConsole() запускает нормально

  Ответить  
 
 автор: .....   (20.08.2010 в 01:29)
3.9 Кб
 
   для: .....   (20.08.2010 в 01:14)
 

забыл сказать что msvc_8
//прикрепил ехе (забыл включить оптимизацию :))

  Ответить  
 
 автор: no_exit   (20.08.2010 в 02:58)   письмо автору
 
   для: .....   (20.08.2010 в 01:29)
 

огромное спасибо за пример ,попробую его на практике.
у меня ms visual studio 2008, вприципе я доволен ,но есть мелкие глюки(по моему мненю).

  Ответить  
 
 автор: .....   (20.08.2010 в 09:51)
 
   для: no_exit   (20.08.2010 в 02:58)
 

Это был не пример :) я просто сам разбирался , а кода нет , поэтому у меня свой :))

вообще в процессе-родителе наверное должно быть что-то типа

//<?
BOOL x_pipe
(charcmdint timeoutDWORD dwFlags)
{
 
HANDLE x_stdoutx_stdin;
 
SECURITY_ATTRIBUTES sat = { sizeof(sat), NULLTRUE }; 
 
STARTUPINFO sin = {sizeof(sin)};

 if (
timeout > -1) {
     if (!
CreatePipe(&x_stdin, &x_stdout, &sat0)) {
    
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)? timeout1000);

while(
PeekNamedPipe(
    
x_stdin, (LPVOIDsTmpBuf,    1024,
    
NULL,    //LPDWORD lpBytesRead,
    
&dTmp,    //LPDWORD lpTotalBytesAvail,
    
NULL )     //LPDWORD lpBytesLeftThisMessage
    
&& dTmp ) {
//    RtlZeroMemory(sTmpBuf, 1024);

*(sTmpBuf) = '\0';
 if (! 
ReadFile(x_stdin, (LPVOIDsTmpBuf,
        
dTmp, &dTmp0) || 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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования