2016-04-25 10 views
-1

Ich versuche, ein Programm in C++ zu schreiben, das Signale an ein anderes sendet, so wie Sie es mit dem kill-Befehl in Linux tun würden, aber es scheint, dass ich einige Konvertierungsprobleme habe. Wie ich es sehe, kann ich Signale nicht einfach als Zeichenfolgen (SIGINT, SIGUSR1 usw.) durch das Terminal leiten und sie einfach in das Programm konvertieren. Ich war auch nicht in der Lage, mein Ziel zu erreichen, indem ich sie als ihren Korrespondenten int s (2,30 usw.) übermittelte und direkt einen Systemaufruf verwendete. Hier ist mein Code:Signal-Sender-Konvertierung

Passing Signale als int-Typen

#include <iostream> 
#include <csignal> 
#include <unistd.h> 
#include <cstdlib> 

using namespace std; 


int main (int argc, char* argv[]) { 
    int pid = atoi(argv[1]); 
    int signal = atoi(argv[2]); //passing signals directly as int 

    cout << signal << endl; 

    int error = kill(pid, signal); 

    if(error !=0) 
     cout << "Error sending signal to catcher program."<< endl; 
    return 0; 
} 

Ausgang

~$./signal_sender 5977 2 
2 
Error sending signal to catcher program. 

Was, wenn ich mit Streichern versuchte, konnte ich nicht eine Umwandlung finden, die richtig funktioniert.

Vielen Dank im Voraus.

+0

Was ist das 'errno' Sie erhalten' töten() '? – NPE

+0

'ESRCH 3/* Kein solcher Prozess * /' Ich schätze, ich habe Signale an das falsche Pid gesendet. Indem ich es korrigiere, habe ich es durch Ints laufen lassen, aber immer noch kein Glück beim Passieren von Strings. –

+0

Siehe meine vollständige Antwort unten. – NPE

Antwort

1

Die beiden häufigsten Ursachen für den Fehler sind:

  • gibt es keinen Prozess mit der pid gegeben;
  • Sie sind nicht berechtigt, das Signal an den Prozess zu senden.

Um herauszufinden, was es ist, ausdrucken und den Wert von errno nach dem Aufruf von kill() ausgefallen untersuchen. Eine Liste der errno Werte, die Sie von kill() erhalten können, finden Sie unter man page.

Als Signalnamen in Zahlen umzuwandeln, siehe How to convert signal name (string) to signal code? (Auf den Punkt gebracht, werden Sie höchstwahrscheinlich Ihre eigene Tabelle von Signalnamen und entsprechenden Nummern haben müssen.)

+0

Es war der erste. Ich habe errno # 3 (Kein solcher Prozess). Scheint, es funktioniert, wenn Signal int-Codes direkt übergeben, aber immer noch kein Glück mit String-Konvertierung. Danke für die Hilfe. –