Communication Inter-Processus (IPC) pour Windows avec C

J'ai un vieux programme écrit en C avec Microsoft Visual C++, et j'ai besoin de mettre en œuvre une sorte de "keepalive", je suis donc en mesure de recevoir la pensée de communication interprocessus dans un nouveau programme qui va tuer et re-lancement de la première, si pas de msg a été reçu dans les 5 dernières secondes.

Le problème est que j'ai été à la recherche pour n'importe quel tutoriel ou un exemple de l'IPC pour Windows en langage C, mais presque tout ce que j'ai trouver est pour le C++.

De l'aide ou des ressources?

EDIT: Comme @Adriano suggéré dans les réponses, je suis en train d'utiliser la Mémoire Partagée. Mais le programme de lanceur est terminée par les Fenêtres, en raison d'une sorte d'exception, je ne suis pas être en mesure de les rattraper. Se produit lors de l'appel de CopyMemory.

Le code est le suivant:

#include "stdafx.h"
#include "windows.h"
#include "iostream"
using namespace std;
int launchMyProcess();
void killMyProcess();
bool checkIfMyProcessIsAlive();
STARTUPINFO sInfo;
PROCESS_INFORMATION pInfo;
HANDLE mappedFile;
LPVOID pSharedMemory;
long lastReceivedBeatTimeStamp;
const int MSECONDS_WITHOUT_BEAT = 500;
const LPTSTR lpCommandLine = "MyProcess.exe configuration.txt";
int main(int argc, char* argv[])
{
mappedFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(int), "Global\\ActivityMonitor");
LPVOID pSharedMemory = MapViewOfFile(mappedFile, FILE_MAP_READ, 0, 0, sizeof(int));
if(!launchMyProcess()){
cout<<"Error creating MyProcess.exe"<<endl;
UnmapViewOfFile(pSharedMemory);
CloseHandle(mappedFile);
return -1;
}
while(true){
Sleep(100);
if(!checkIfMyProcessIsAlive()){
cout<<"Relaunching MyProcess...";
killMyProcess();
if(!launchMyProcess()){
cout<<"Error relaunching MyProcess.exe"<<endl;
UnmapViewOfFile(pSharedMemory);
CloseHandle(mappedFile);
return -1;
}
}
}
UnmapViewOfFile(pSharedMemory);
CloseHandle(mappedFile);
return 0;
}
bool checkIfMyProcessIsAlive()
{
static int volatile latestMagicNumber = 0;
int currentMagicNumber = 0;
CopyMemory(&currentMagicNumber, pSharedMemory, sizeof(int));
if(currentMagicNumber != latestMagicNumber){
latestMagicNumber = currentMagicNumber;
return true;
}
return false;
}
int launchMyProcess()
{
ZeroMemory(&sInfo, sizeof(sInfo));
sInfo.cb = sizeof(sInfo);
ZeroMemory(&pInfo, sizeof(pInfo));
return CreateProcess(NULL, lpCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &sInfo, &pInfo);
}
void killMyProcess()
{
TerminateProcess(pInfo.hProcess, 0);
CloseHandle(pInfo.hProcess);
CloseHandle(pInfo.hThread);
Sleep(3000);
}
  • Il n'a pas d'importance si les tutoriels sont en C++, ils vont être en utilisant le même C fonctions WIN32.
  • Ce n'est pas, mais C tutoriel serait reçu avec joie 🙂
  • so I am able to receive it thought interprocess communication into a new program est un peu vague. Comment, exactement, êtes-vous d'obtenir des informations de l'ancien programme? Cela ne ressemble pas à un IPC de problème pour moi. Si votre nouveau programme engendre l'ancienne, via la fonction CreateProcess dire, alors vous pouvez le tuer et re-créer très facilement.
  • Oui @Skizz la création/fin de processus fonctionne bien. Maintenant, je n'ai pas mis en œuvre de toute forme de communication entre l'ancien et le nouveau (lanceur). J'essaie de trouver quelle est la meilleure approche pour quelque chose d'aussi simple que de emmiting un battement de coeur, comme Mark Wilkins a dit
InformationsquelleAutor Roman Rdgz | 2012-05-10