You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@httpd.apache.org by Asif M <as...@gmail.com> on 2008/09/19 01:57:23 UTC

[users@httpd] Apache Control : Starting and Stopping Apache from foreign application

Hi all,

I have the following problem :-

I wrote a Apache Control Program in Visual Studio 2003, which does the
following
1>. Starts Apache with CreateProcess Call. I run Apache on the command
interpreter but not as a service.
2>. Redirects all standard input / output of Apache to the Apache Control
Program so that the Apache cmd-line output actually appears in the log
window of the control program
3>. Stops Apache

#3 has some problem.
When I try to stop Apache, I try the following
1>. Send a control-C control event to the process the CreateProcess call
returns
2>. Close the input pipe which I passed on to Apache during the
CreateProcess
3>. Do an TerminateProcess on the process id returned by the CreateProcess
call

When I run Apache from the command line, a ctrl+c stops both the running
httpd process. However programmatically #1 does not have any effect. It
feels that Apache has not received the Ctrl+C I send.

#2 does not have any impact on the running Apache Process either

#3 only kills the primary httpd process running. It does not kill the second
process.

Here is the code excerpt :-

/////////////  STARTING APACHE //////////////////////
_tcscpy(_pszCmdLine,m_szApacheBaseDir);
    _tcscat(_pszCmdLine,_T("\\bin\\httpd.exe"));
    _tcscat(_pszCmdLine,_T(" -f "));
    _tcscat(_pszCmdLine,m_szApacheCfgFile);
    _tcscat(_pszCmdLine,_T(" -e debug"));

//..  code to create input/output/error pipes and replicate the handles in
the si structure

if (!::CreateProcess(
        NULL,
        (LPTSTR)pszCmdLine,
        NULL, NULL,
        TRUE,
        CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP,
        NULL, NULL,
        &si,
        &pi))
    {
        int n = GetLastError();
        return FALSE;
    }


///////////////////// STOPPING APACHE ///////////////////////
    int j = _tcslen(ctrlC);
    WriteFile(m_hStdinWrite, (LPCTSTR)ctrlC,2, &dwWritten, NULL);

    if ( !GenerateConsoleCtrlEvent(CTRL_C_EVENT,m_dwProcessGroupId))
        j = GetLastError();

    CloseHandle(m_hStdinWrite);
    CloseHandle(m_hStdinRead);

    if (m_dwProcessGroupId)
    {
        _hProcessHandle =
OpenProcess(PROCESS_ALL_ACCESS,FALSE,m_dwProcessGroupId);
        if (_hProcessHandle)
        {
            GetExitCodeProcess(_hProcessHandle,&_dwExitCode);
            int n = GetLastError();
            TerminateProcess(_hProcessHandle,1);
        }
        int n = GetLastError();
    }



I would like to know how to send a Ctrl+C event to apache so that I can
cleanly / gracefully shutdown Apache.
Any pointers will be extremely appreciated?

Thanks in Advance,
Asif

Re: [users@httpd] Apache Control : Starting and Stopping Apache from foreign application

Posted by Asif M <as...@gmail.com>.
Hi ,

I am not running apache as a service.
I am running it from another application in a sort of way similar to
launching apache from the command line

Regards,
asif

On Fri, Sep 19, 2008 at 2:13 PM, Foo JH <jh...@extracktor.com> wrote:

> If all you wand to do is start and stop the Apache service, why don't you
> simply do the following on the command line:
> net start Apache2
> net stop Apache2
>
>
> Asif M wrote:
>
>> Hi all,
>>
>> I have the following problem :-
>>
>> I wrote a Apache Control Program in Visual Studio 2003, which does the
>> following
>> 1>. Starts Apache with CreateProcess Call. I run Apache on the command
>> interpreter but not as a service.
>> 2>. Redirects all standard input / output of Apache to the Apache Control
>> Program so that the Apache cmd-line output actually appears in the log
>> window of the control program
>> 3>. Stops Apache
>>
>> #3 has some problem.
>> When I try to stop Apache, I try the following
>> 1>. Send a control-C control event to the process the CreateProcess call
>> returns
>> 2>. Close the input pipe which I passed on to Apache during the
>> CreateProcess
>> 3>. Do an TerminateProcess on the process id returned by the CreateProcess
>> call
>>
>> When I run Apache from the command line, a ctrl+c stops both the running
>> httpd process. However programmatically #1 does not have any effect. It
>> feels that Apache has not received the Ctrl+C I send.
>>
>> #2 does not have any impact on the running Apache Process either
>>
>> #3 only kills the primary httpd process running. It does not kill the
>> second process.
>>
>> Here is the code excerpt :-
>>
>> /////////////  STARTING APACHE //////////////////////
>> _tcscpy(_pszCmdLine,m_szApacheBaseDir);
>>    _tcscat(_pszCmdLine,_T("\\bin\\httpd.exe"));
>>    _tcscat(_pszCmdLine,_T(" -f "));
>>    _tcscat(_pszCmdLine,m_szApacheCfgFile);
>>    _tcscat(_pszCmdLine,_T(" -e debug"));
>>
>> //..  code to create input/output/error pipes and replicate the handles in
>> the si structure
>>
>> if (!::CreateProcess(
>>        NULL,
>>        (LPTSTR)pszCmdLine,
>>        NULL, NULL,
>>        TRUE,
>>        CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP,
>>        NULL, NULL,
>>        &si,
>>        &pi))
>>    {
>>        int n = GetLastError();
>>        return FALSE;
>>    }
>>
>>
>> ///////////////////// STOPPING APACHE ///////////////////////
>>    int j = _tcslen(ctrlC);
>>    WriteFile(m_hStdinWrite, (LPCTSTR)ctrlC,2, &dwWritten, NULL);
>>      if ( !GenerateConsoleCtrlEvent(CTRL_C_EVENT,m_dwProcessGroupId))
>>        j = GetLastError();
>>
>>    CloseHandle(m_hStdinWrite);
>>    CloseHandle(m_hStdinRead);
>>
>>    if (m_dwProcessGroupId)
>>    {
>>        _hProcessHandle =
>> OpenProcess(PROCESS_ALL_ACCESS,FALSE,m_dwProcessGroupId);
>>        if (_hProcessHandle)
>>        {
>>            GetExitCodeProcess(_hProcessHandle,&_dwExitCode);
>>            int n = GetLastError();
>>            TerminateProcess(_hProcessHandle,1);
>>        }
>>        int n = GetLastError();
>>    }
>>
>>
>>
>> I would like to know how to send a Ctrl+C event to apache so that I can
>> cleanly / gracefully shutdown Apache.
>> Any pointers will be extremely appreciated?
>>
>> Thanks in Advance,
>> Asif
>>
>
>

Re: [users@httpd] Apache Control : Starting and Stopping Apache from foreign application

Posted by Foo JH <jh...@extracktor.com>.
If all you wand to do is start and stop the Apache service, why don't 
you simply do the following on the command line:
net start Apache2
net stop Apache2

Asif M wrote:
> Hi all,
> 
> I have the following problem :-
> 
> I wrote a Apache Control Program in Visual Studio 2003, which does the 
> following
> 1>. Starts Apache with CreateProcess Call. I run Apache on the command 
> interpreter but not as a service.
> 2>. Redirects all standard input / output of Apache to the Apache 
> Control Program so that the Apache cmd-line output actually appears in 
> the log window of the control program
> 3>. Stops Apache
> 
> #3 has some problem.
> When I try to stop Apache, I try the following
> 1>. Send a control-C control event to the process the CreateProcess call 
> returns
> 2>. Close the input pipe which I passed on to Apache during the 
> CreateProcess
> 3>. Do an TerminateProcess on the process id returned by the 
> CreateProcess call
> 
> When I run Apache from the command line, a ctrl+c stops both the running 
> httpd process. However programmatically #1 does not have any effect. It 
> feels that Apache has not received the Ctrl+C I send.
> 
> #2 does not have any impact on the running Apache Process either
> 
> #3 only kills the primary httpd process running. It does not kill the 
> second process.
> 
> Here is the code excerpt :-
> 
> /////////////  STARTING APACHE //////////////////////
> _tcscpy(_pszCmdLine,m_szApacheBaseDir);
>     _tcscat(_pszCmdLine,_T("\\bin\\httpd.exe"));
>     _tcscat(_pszCmdLine,_T(" -f "));
>     _tcscat(_pszCmdLine,m_szApacheCfgFile);
>     _tcscat(_pszCmdLine,_T(" -e debug"));
> 
> //..  code to create input/output/error pipes and replicate the handles 
> in the si structure
> 
> if (!::CreateProcess(
>         NULL,
>         (LPTSTR)pszCmdLine,
>         NULL, NULL,
>         TRUE,
>         CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP,
>         NULL, NULL,
>         &si,
>         &pi))
>     {
>         int n = GetLastError();
>         return FALSE;
>     }
> 
> 
> ///////////////////// STOPPING APACHE ///////////////////////
>     int j = _tcslen(ctrlC);
>     WriteFile(m_hStdinWrite, (LPCTSTR)ctrlC,2, &dwWritten, NULL);
>    
>     if ( !GenerateConsoleCtrlEvent(CTRL_C_EVENT,m_dwProcessGroupId))
>         j = GetLastError();
> 
>     CloseHandle(m_hStdinWrite);
>     CloseHandle(m_hStdinRead);
> 
>     if (m_dwProcessGroupId)
>     {
>         _hProcessHandle = 
> OpenProcess(PROCESS_ALL_ACCESS,FALSE,m_dwProcessGroupId);
>         if (_hProcessHandle)
>         {
>             GetExitCodeProcess(_hProcessHandle,&_dwExitCode);
>             int n = GetLastError();
>             TerminateProcess(_hProcessHandle,1);
>         }
>         int n = GetLastError();
>     }
> 
> 
> 
> I would like to know how to send a Ctrl+C event to apache so that I can 
> cleanly / gracefully shutdown Apache.
> Any pointers will be extremely appreciated?
> 
> Thanks in Advance,
> Asif


---------------------------------------------------------------------
The official User-To-User support forum of the Apache HTTP Server Project.
See <URL:http://httpd.apache.org/userslist.html> for more info.
To unsubscribe, e-mail: users-unsubscribe@httpd.apache.org
   "   from the digest: users-digest-unsubscribe@httpd.apache.org
For additional commands, e-mail: users-help@httpd.apache.org


Re: [users@httpd] Apache Control : Starting and Stopping Apache from foreign application

Posted by Eric Covener <co...@gmail.com>.
On Thu, Sep 18, 2008 at 7:57 PM, Asif M <as...@gmail.com> wrote:

> When I run Apache from the command line, a ctrl+c stops both the running
> httpd process. However programmatically #1 does not have any effect. It
> feels that Apache has not received the Ctrl+C I send.

This thread might give you some background:
http://www.mail-archive.com/dev@httpd.apache.org/msg39402.html

-- 
Eric Covener
covener@gmail.com

---------------------------------------------------------------------
The official User-To-User support forum of the Apache HTTP Server Project.
See <URL:http://httpd.apache.org/userslist.html> for more info.
To unsubscribe, e-mail: users-unsubscribe@httpd.apache.org
   "   from the digest: users-digest-unsubscribe@httpd.apache.org
For additional commands, e-mail: users-help@httpd.apache.org