正文

一个精悍而巧妙的程序(发表时间: 2006-8-4 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;
}

阅读(2539) | 评论(5) | 复制链接


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

评论

评论人: 匿名 发布时间: 2007-2-23 13:34:00
写得不错,有个问题,包含文件那里是不是应该使用<>来包含标准头文件啊
评论人: gezhenqiang 发布时间: 2006-8-8 13:01:00
真是妙!謝謝這位高人!呵呵!真是高深莫測!
评论人: gezhenqiang 发布时间: 2006-8-8 12:46:00
多謝多謝!獲益良多!
评论人: cracker007 发布时间: 2006-8-5 22:46:00
妙就妙在它的main中的if和else都会执行,我们一般都以为if和else两者只有一个会执行,但是这个程序就是一个反例。它巧妙的用了argv[0].一开始我也百思不得其解,后来才恍然大悟,使用CreateProcess的时候第一个传入的参数不再是程序名,这一点就是使得该程序的入口参数有了奇妙的变化,自身在“死循环的情况下”,依靠另外一个“克隆的自我”来结束自己的生命。
评论人: gezhenqiang 发布时间: 2006-8-5 20:23:00
這位高人,可否在程序上加些註解啊!我這個初學菜鳥看不太懂哦!再再說說它妙在哪里哦!呵呵!我想學習學習!

发表评论

您的昵称: 昵称不填为“匿名”

您的Email: (可选)

评论内容:(字数请控制在500字以内)