Pregunta

De acuerdo con esto http://www.cplusplus.com/reference/ clibrary / csignal / signal.html

SIGINT es generalmente usado / causado por el usuario. ¿Cómo provoco un kill(pid, SIGINT); en c ++? Vi un ejemplo usando <=> pero prefiero causarlo de otra manera. También estoy usando Windows.

¿Fue útil?

Solución

C89 y C99 definen raise () en signal.h:

#include <signal.h>

int raise(int sig);

Esta función envía una señal al proceso de llamada y es equivalente a

kill(getpid(), sig);

Si la plataforma admite subprocesos, la llamada es equivalente a

pthread_kill(pthread_self(), sig);

El valor de retorno es 0 en caso de éxito, de lo contrario no es cero.

Otros consejos

Causa un SIGINT presionando Ctrl + C .

Código de ejemplo:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void siginthandler(int param)
{
  printf("User pressed Ctrl+C\n");
  exit(1);
}

int main()
{
  signal(SIGINT, siginthandler);
  while(1);
  return 0;
}

Cuando se ejecuta:

$ ./a.out 
^CUser pressed Ctrl+C
$ 

(Tenga en cuenta que este es un código C puro, aunque debería funcionar en C ++)

Editar: la única forma que tengo de enviar kill(pid, SIGINT) además de presionar interactivamente Ctrl + C es usar <=> como dijiste ...

¿En qué otra forma estás pensando? La función kill() es la única forma en que el núcleo ofrece enviar una señal mediante programación.

En realidad, mencionaste que estabas usando Windows. Ni siquiera estoy seguro de qué hace <=> en Windows, ya que Windows no tiene la misma arquitectura de señal que los sistemas derivados de Unix. Win32 ofrece la función TerminateProcess, que puede hacer lo que quieras. También existe la función GenerateConsoleCtrlEvent , que se aplica para consolar programas y simula Ctrl + C o Ctrl + Break.

" Señales " a este respecto son un concepto Unix / POSIX. Windows no tiene equivalente directo.

void SendSIGINT( HANDLE hProcess )
{
    DWORD pid = GetProcessId(hProcess);
    FreeConsole();
    if (AttachConsole(pid))
    {
        // Disable Ctrl-C handling for our program
        SetConsoleCtrlHandler(NULL, true);

        GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); // SIGINT

        //Re-enable Ctrl-C handling or any subsequently started
        //programs will inherit the disabled state.
        SetConsoleCtrlHandler(NULL, false);

        WaitForSingleObject(hProcess, 10000);
    }
}

Supongo que esta es una aplicación Win32 ...

Para un " controlado " o " seguro " salir, si la aplicación usa un bucle de mensajes, puede usar la API PostQuitMessage desde adentro o PostMessage fuera de ella. De lo contrario, necesitará obtener el ID del hilo / proceso y usar la API TerminateThread o TerminateProcess, dependiendo de si desea matar solo un hilo o todo el proceso y todos los hilos que ha generado. Microsoft lo explica muy bien (como con todas las llamadas API) en MSDN:

http://msdn.microsoft.com/en-us/library /aa450927.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top