2016-07-11 26 views
1

Ich bin neu mit C++. Mein Problem ist, dass ich einen Prozess habe, der viele Prozesse erzeugt, ich möchte eines der Kinder identifizieren (pid bekommen). Das Durchschleifen von Kindern würde viele Ressourcen erfordern (frag nicht warum). SO versuche ich, die PID des Prozesses durch (irgendwie) zu identifizieren, wenn es sd_notify verwendet und die PID erhält (ich nicht wirklich jetzt, wenn es möglich ist). Ich bin mit Ubuntu 14.04 und erstellt wenig Testprogramm:C++: undefinierter Verweis auf `sd_notify '

#include <systemd/sd-daemon.h> 
#include <stdio.h> 

int main() 
{ 
    int a; 
    a = sd_notify(0, "READY=1"); 
    printf("%d -> \n", a); 
    fflush(stdout); 
} 

Aber es gibt mir Fehlermeldung, dass undefined reference to 'sd_notify'.

S.S Ich fand, dass sd_notify für systemd Systeme ist. Was ist das in Upstart-Systemen gleichzusetzen? Oder wie kann ich sicherstellen, dass der Prozess, den ich suche, diese Funktion nicht nutzt? Oder ist es möglich, alle Nachrichten, die von Prozessen gesendet werden, mit sd_notify zu protokollieren?

+0

Scheint ein bisschen wie [XY-Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy - Problem) - Warum glauben Sie, dass Sie einen Prozess identifizieren können, nur weil er 'sd_notify' verwendet? Warum musst du die PID dieses bestimmten Kindes überhaupt bekommen? – davmac

+0

Was ich eigentlich versuche, ist, dass ich als Benutzer A angemeldet bin, den Prozess als Benutzer B anlege, und dieser Prozess eine Sitzung für Benutzer B erstellt ('/ etc/X11/Xsession 'gnome-session --session = ubuntu'') Ich versuche, den dbus-Verbindungsnamen (von dbus-daemon --session) von diesem Prozess von Benutzer B zu erhalten und den Benutzer abzumelden. – Rasty

+0

ok, dann ist das die Frage, die Sie gestellt haben sollten. :) (und mit viel Detail hinzugefügt, weil es eine Menge Dinge, die nach wie vor unklar, über die Grenzen von dem, was Sie tun, warum nicht die Standard-DBus-APIs verwenden, -. Entweder systemd oder consolekit - die Sitzung zu lokalisieren) – davmac

Antwort

3

Try libsystemd-daemon-devel Installation und kompilieren

mit

g++ -o sig sig.cpp -lsystemd-daemon

+0

Vielen Dank, es hat funktioniert. Könnten Sie mir bitte sagen, ob es möglich ist, alle Nachrichten, die von Prozessen gesendet werden, mit sd_notify zu protokollieren? Oder ist es irgendwo, wo es geloggt wird? Danke noch einmal. – Rasty

+1

@Rasty Ich habe diese Bibliothek noch nicht benutzt, kann also nichts dazu sagen. Schlage vor, dass Sie eine andere Frage stellen. Bitte akzeptiere diese Antwort, wenn es dir geholfen hat. Vielen Dank! – alasin

+0

für mich 'sudo apt-get installieren libsystemd-dev'und hängt' -lsystemd' an kubuntu 16.04. –

0

Sie die Verknüpfung nicht auf die erforderliche Bibliothek bei der Kompilierung. Versuchen Sie, die Option -lsystemd zu Ihrer Kompilierungsbefehlszeile hinzuzufügen.

+0

Sorry, ich vergaß zu erwähnen, ich bin mit 'g ++ -o sig sig.cpp -l systemd' – Rasty

+1

Kein Platz -' -lsystemd' - üblich ist (nicht sicher, ob es wirklich notwendig ist). – davmac

+1

Platz oder kein Platz macht keinen Unterschied, beide erlaubt – Smeeheey

Verwandte Themen