Windows 多进程通信API总结

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

http://www.ibm.com/developerworks/cn/linux/l-ipc2lin1.html

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

创建进程

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

BOOL CreateProcess
(
LPCTSTRlpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes。
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFOlpStartupInfo,
LPPROCESS_INFORMATIONlpProcessInformation
);

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

#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后再将其关闭。


#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 http://www.baidu.com/"  
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;
	if (!CreateProcess(IE,CMD,NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL,&startup_info,&process_info))
	{
		cout<<"Create Process Error:"<<GetLastError()<<endl;
		return 0;
	}
	Sleep(5000);
	TerminateProcess(process_info.hProcess,0);
	return 0;
}

被创建的句柄通过process_info.hProcess返回。如果传递参数给新的进程,第一个命令行参数必须重复应用程序名称,整个命令行会被传递给子进程。


传递参数给新进程。

#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<<"No arguments given starting child process"<<endl;
		wchar_t argument[256];
		wsprintf(argument,L"\"%s\" Hello",argv[0]);
		ZeroMemory(&process_info,sizeof(process_info));
		ZeroMemory(&startup_info,sizeof(startup_info));
		startup_info.cb=sizeof(startup_info);
		if (CreateProcess(argv[0],argument,0,0,0,0,0,0,&startup_info,&process_info)==0)
		{
			cout<<"Error "<<GetLastError()<<endl;
		}
		WaitForSingleObject(process_info.hProcess,INFINITE);
	}
	else{
		cout<<"Argument "<<argv
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值