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;
}