Signal raisen in ander programma

Pagina: 1
Acties:

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Ik heb een programma (programma A) dat als volgt het terminatie-signaal ondervangt:
C:
1
signal(SIGTERM, catch_term);

Dit doet het niet alleen voor SIGTERM, maar ook voor alle andere SIG...-waarden.
Nou wil ik graag dit programma opstarten vanuit programma B, bijvoorbeeld dmv spawnl of CreateProcess (dat lukt helemaal) en het later weer killen (dat lukt niet helemaal). Het moet dan namelijk wel zo zijn dat catch_term aangeroepen wordt, anders sluit A niet netjes af.

Ik heb dit al geprobeerd door TerminateProcess aan te roepen, maar dat sluit m niet netjes af. Ik heb gekeken naar de raise-functie, maar die kan niet naar een ander proces raisen.
Ik dacht ook dat ik misschien die Control-C die voor de SIGTERM zorgt kan schrijven naar A en wel als volgt:
C:
1
2
sprintf( chBuf, "%c", 0x03);
WriteFile(hChildStdinWrDup, chBuf, 1, &dwWritten, NULL);

waarbij hChildStdinWrDup (als het goed is) een handle naar dat stdin van A is. Ook dit werkt niet.

Iemand een idee hoe ik dit voor elkaar kan krijgen?

[ Voor 4% gewijzigd door SWfreak op 14-01-2003 21:22 . Reden: verduidelijkingen ]


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Weer wat verder gezocht en het schijnt als volgt te moeten kunnen:
C:
1
2
3
4
5
6
HANDLE h = OpenProcess (PROCESS_TERMINATE, FALSE, dwProcessId);
  if (!h)
    return;
  if (!wait || WaitForSingleObject (h, 200) != WAIT_OBJECT_0)
    TerminateProcess (h, sig << 8);
  CloseHandle (h);

De enige vraag is nu: hoe kom ik aan de juiste processId?
Nog een ander idee: onder UNIX bestaat er in C ook gewoon de functie kill(). Weet iemand of die er onder windows ook is?

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Weet niet of er andere mensen nog geinteresseerd in zijn (misschien later nog eens), maar dit is de oplossing die ik heb gevonden en het blijkt te doen:
Start met
C:
1
2
3
4
5
6
7
8
9
10
11
12
BOOL ret = CreateProcess(NULL, 
        COMMAND,       // command line 
        NULL,          // process security attributes 
        NULL,          // primary thread security attributes 
        TRUE,          // handles are inherited 
        0,             // creation flags 
        NULL,          // use parent environment 
        NULL,          // use parent current directory 
        &siStartInfo,  // STARTUPINFO pointer 
        &piProcInfo);  // receives PROCESS_INFORMATION

SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE );

In CtrlHandler:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
BOOL CtrlHandler(DWORD fdwCtrlType) 
{ 
    switch (fdwCtrlType) 
    { 
        // Handle the CTRL+* signal. 
  
        case CTRL_C_EVENT:
        case CTRL_BREAK_EVENT:
            return TRUE; 
 
        default: 
 
            return FALSE; 
    } 
}

Stop nu met:
C:
1
GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0);

Er bestaat ook nog een programma kill.exe van cygwin dat iets vergelijkbaars en beter doet, maar daar heb ik nog geen bewijs van gevonden

Met dank aan Jay Berg voor een zetje...