当前位置:首页 > Windows程序 > 正文

Windows 多进程通信API总结

2021-03-26 Windows程序

在一个大型的应用系统中,往往需要多个进程相互协作,进程间通信(IPC,Inter Process Communication)就显得比较重要了。在Linux系统中,有很多种IPC机制,,比如说,信号(signal)、管道(pipe)、消息队列(message queue)、信号量(semaphore)和共享内存(shared memory)、套接字(socket)等,其实Windows操作系统也支持这些东西。在IBM的Developerworks发现了一篇关于Windows与Linux 之间IPC机制API比较的文章,写得很不错,链接

下面大部分内容是关于这些机制的API的实现。

创建进程

进程的创建可以调用CreateProcess函数,CreateProcess有三个重要的参数,运行进程的名称、指向STARTUPINFO结构的指针、指向PROCESS_INFORMATION结构的指针。其原型如下:

[cpp] 

BOOL CreateProcess  

(  

LPCTSTRlpApplicationName,  

LPTSTR lpCommandLine,  

LPSECURITY_ATTRIBUTES lpProcessAttributes。  

LPSECURITY_ATTRIBUTES lpThreadAttributes,  

BOOL bInheritHandles,  

DWORD dwCreationFlags,  

LPVOID lpEnvironment,  

LPCTSTR lpCurrentDirectory,  

LPSTARTUPINFOlpStartupInfo,  

LPPROCESS_INFORMATIONlpProcessInformation  

);  


给个例子,如果启动时应用程序带有命令行参数,进程将输出命令行参数,并创建一个不带任何参数的子线程;如果不带有任何参数,则会输出一条提示消息。

[cpp] 

#include <Windows.h>  

#include <tchar.h>  

#include <iostream>  

using namespace std;  

int _tmain(int argc, _TCHAR* argv[]){  

    STARTUPINFO startup_info;  

    PROCESS_INFORMATION process_info;  

    if (argc>1)  

    {  

        cout<<"Argument"<<argv[1]<<endl;  

        cout<<"开启子线程"<<endl;  

        ZeroMemory(&process_info,sizeof(process_info));  

        ZeroMemory(&startup_info,sizeof(startup_info));  

        startup_info.cb=sizeof(startup_info);  

        if (CreateProcess(argv[0],0,0,0,0,0,0,0,&startup_info,&process_info)==0)  

        {  

            cout<<"Error"<<endl;  

        }  

        WaitForSingleObject(process_info.hProcess,INFINITE);  

    }  

    else{  

        cout<<"No arguments"<<endl;  

    }  

    getchar();  

}  


再给个例子,利用CreateProcess开启一个新线程,启动IE浏览器,打开百度的主页,5s后再将其关闭。


[cpp] 

#include <Windows.h>  

#include <tchar.h>  

#include <iostream>  

using namespace std;  

#define IE L"C:\\Program Files\\Internet Explorer\\iexplore.exe"    

#define CMD L"open "    

int _tmain(int argc, _TCHAR* argv[]){  

    STARTUPINFO startup_info;  

    GetStartupInfo(&startup_info);  

    PROCESS_INFORMATION process_info;  

    startup_info.dwFlags=STARTF_USESHOWWINDOW;  

    startup_info.wShowWindow=SW_HIDE;  

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/67616.html