正文

一个精悍而巧妙的程序2006-08-04 16:29:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/cracker007/17247.html

分享到:

近期用CreateProcess的时候出了些问题,发现第一个时间片的末尾总会有重复的指令在执行,于是想看看_beginthreadex能不能解决这个问题,无奈_beginthreadex却不接受我的线程函数,问了问v兄,v兄也说不清楚原因,给出了互斥体的方法来解决。问题虽然解决了,但是无法用_beginthreadex总让我觉得很不爽,毕竟谁知道CreateProcess什么时候会出点问题呢。于是到处搜索资料,却意外的发现了一个叹为观止的进程间的自我通信,虽然与我本来的目的相差了很多,但是这个程序巧妙的构思让我兴奋不已,不敢独享,拿出来让大家也欣赏一下:

#include"iostream.h"
#include"windows.h"


static LPCTSTR g_szContinueEvent="w2kdg.EventDemo.event.Continue";

BOOL CreateChild(LPCTSTR szAppName)
{
 STARTUPINFO si;
 ::ZeroMemory(reinterpret_cast<void*>(&si),sizeof(si));
 si.cb=sizeof(si);
 PROCESS_INFORMATION pi;
 BOOL bCreateOK=::CreateProcess(szAppName,
                             "child",
           NULL,
           NULL,
           FALSE,
           0,
           NULL,
           NULL,
           &si,
           &pi);
 if(bCreateOK)
 {
  ::CloseHandle(pi.hProcess);
  ::CloseHandle(pi.hThread);
 }
 return bCreateOK;
}

void WaitForChild(LPCTSTR szAppName)
{
 HANDLE hEventContinue=::CreateEvent(NULL,
                                  TRUE,
          FALSE,
          g_szContinueEvent);
 
 if(hEventContinue!=NULL)
 {
  if(::CreateChild(szAppName))
  {
   ::WaitForSingleObject(hEventContinue,INFINITE);
  }
  ::CloseHandle(hEventContinue);
  hEventContinue=INVALID_HANDLE_VALUE;
 }
}

void SignalParent()
{
 HANDLE hEventContinue=::OpenEvent(EVENT_MODIFY_STATE,
                                FALSE,
           g_szContinueEvent);
 if(hEventContinue!=NULL)
 {
  ::SetEvent(hEventContinue);
 }
 ::CloseHandle(hEventContinue);
 hEventContinue=INVALID_HANDLE_VALUE;
}

int main(int argc,char *argv[])
{
 cout<<"\n"<<argv[0]<<endl;
 if(::strcmp(argv[0],"child")!=0)
 {
  cout<<"Parent waiting on child"<<endl;
  ::WaitForChild(argv[0]);
  cout<<"Parent released"<<endl;
 }
 else
 {   
  ::SignalParent();
 }
 return 0;
}

阅读(4234) | 评论(5)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册