В настоящее время я работаю над OAuth 2.0 и спецификацией OpenID connect. Итак, вот мое понимание: раньше они были:
OAuth: OAuth видел, что он появился как стандарт, рассматривающий все эти проприетарные подходы, и поэтому мы OAuth 1.o был стандартным, но рассматривал только авторизацию. Не многие люди заметили, но это как бы начало расти. Затем у нас был OAuth 2.0 в 2012 году. Технический директор, архитекторы действительно начали обращать внимание, поскольку мир движется в сторону облачных вычислений, а вычислительные устройства - в мобильные и другие подобные устройства. OAuth как бы решает основную проблему, когда клиенты программного обеспечения могут предоставлять IDP-услугу одной компании и получать множество услуг от разных поставщиков, таких как salesforce, SAP и т. Д. Таким образом, интеграция здесь действительно выглядит как сценарий федерации - одна большая проблема, использование SAML обходится дорого. так что давайте рассмотрим OAuth 2.o. Ох, упустил один важный момент, который за это время Google почувствовал, что OAuth на самом деле не обращается к Аутентификации, как IDP будет передавать пользовательские данные SP (который на самом деле чудесно адресован в SAML), а также с другими слабыми сторонами, такими как:
а. OAuth 2.o четко не говорит, как будет происходить регистрация клиента b. в нем ничего не говорится о взаимодействии между SP (Resource Server) и клиентским приложением (например, Analytics Server предоставляет данные как Resource Server, а приложение отображает эти данные как Client)
Уже есть Прекрасные ответы, данные здесь технически, я подумал о том, чтобы дать краткую эволюционную перспективу
.Check this thread for grouping processes within a "job".
If that does not work for you, a home grown approach might go as follows:
Sample code:
DWORD myprocID = 1234; // your main process id
PROCESSENTRY32 pe;
memset(&pe, 0, sizeof(PROCESSENTRY32));
pe.dwSize = sizeof(PROCESSENTRY32);
HANDLE hSnap = :: CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (::Process32First(hSnap, &pe))
{
BOOL bContinue = TRUE;
// kill child processes
while (bContinue)
{
// only kill child processes
if (pe.th32ParentProcessID == myprocID)
{
HANDLE hChildProc = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
if (hChildProc)
{
::TerminateProcess(hChildProc, 1);
::CloseHandle(hChildProc);
}
}
bContinue = ::Process32Next(hSnap, &pe);
}
// kill the main process
HANDLE hProc = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, myprocID);
if (hProc)
{
::TerminateProcess(hProc, 1);
::CloseHandle(hProc);
}
}
There's How To Kill a Process Tree, but it's in C#. I don't think it's too hard to port that to C.
See NtQueryInformationProcess Function and TerminateProcess Function.
The following is for Linux, but I hope it helps for Windows with some adaptation.
When you fork(), save the return value, which is the pid of the child process, then when the parent is about to exit, kill() the pid.
If you have multiple child processes, you can send the kill to the process group. By default, the child processes have the same pgid as the parent.
Убить целое дерево со всеми !!! Ребенок:
bool __fastcall KillProcessTree(DWORD myprocID, DWORD dwTimeout)
{
bool bRet = true;
HANDLE hWnd;
PROCESSENTRY32 pe;
memset(&pe, 0, sizeof(PROCESSENTRY32));
pe.dwSize = sizeof(PROCESSENTRY32);
HANDLE hSnap = :: CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (::Process32First(hSnap, &pe))
{
BOOL bContinue = TRUE;
// kill child processes
while (bContinue)
{
if (pe.th32ParentProcessID == myprocID)
{
ShowMessage ("Gleich - KILL PID: " + AnsiString(pe.th32ProcessID));
// Rekursion
KillProcessTree(pe.th32ProcessID, dwTimeout);
HANDLE hChildProc = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
if (hChildProc)
{
GetWindowThreadProcessId(hWnd, &myprocID);
// CLOSE Message s
PostMessage(hWnd, WM_CLOSE, 0, 0) ;
if (WaitForSingleObject(hChildProc, dwTimeout) == WAIT_OBJECT_0)
bRet = true;
else
{
bRet = TerminateProcess(hChildProc, 0);
}
::CloseHandle(hChildProc);
}
}
bContinue = ::Process32Next(hSnap, &pe);
}
// kill the main process
HANDLE hProc = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, myprocID);
if (hProc)
{
::TerminateProcess(hProc, 1);
::CloseHandle(hProc);
}
}
return bRet;
}