1. CriticalSection
2. Event CreateEvent
3. 互斥对象 CreateMutex 互斥对象还可以实现进程间的同步。实现一个进程的运行。 GetLastError() = Error_Already_Exists .....
进程间的同步
1. 邮件槽 CreateMailSlot
优缺点:
1. 发送的是数据报,使用的是UDP协议不可靠连接。
2. 使能单向传送数据,只能从客户端到服务器端,客户端写,服务器端读。
3. 不能超过400KB数据
4. 可以一个客户端到多个服务器发送。
命名管道
createNamePipe connectNamePipe
优缺点
1. 发送的数据流,使用的TCP协议,可靠连接。
2. 双向发送数据,能读能写。
3. 数据没有限制
匿名管道 只能被用在父进程与子进程之间进行数据通信。与命名管道相比,匿名管道不能被使用在网络进程之间。
子进程.exe
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE read = NULL;
char text[100] = {0};
DWORD readtext;
read = GetStdHandle(STD_INPUT_HANDLE);
if (ReadFile(read, text,100,&readtext,NULL))
{
printf("从匿名管道中读取的数据是%s\r\n",text);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE read = NULL, write = NULL;
SECURITY_ATTRIBUTES ss;
STARTUPINFO sa = {0};
PROCESS_INFORMATION pp = {0};
char text[] = "匿名管道程序测试!";
DWORD writetext;
ss.nLength = sizeof ss;
ss.lpSecurityDescriptor = NULL;
ss.bInheritHandle =TRUE;
if (CreatePipe(&read,&write, &ss,0))
{
cout << "创建匿名管道成功\r\n" <<endl;
sa.cb = sizeof(sa);
sa.dwFlags = STARTF_USESHOWWINDOW;
sa.hStdInput = read;
sa.hStdOutput = write;
sa.hStdError = GetStdHandle(STD_ERROR_HANDLE);
if (::CreateProcess(NULL,_T("紫禁城.exe"),NULL,NULL,TRUE,0, NULL,NULL, &sa,&pp))
{
printf("创建紫禁城成功\r\n");
WriteFile(write,text,sizeof(text),&writetext,NULL);
printf("通过匿名管道写入数据成功\r\n");
}
}
return 0;
}