Parent-Prozess soll auf Signal von Child warten
-
Ich soll ein Programm schreiben indem der Child-Prozess dem Parent mittels eines Signales die Betriebsbereitschaft signalisiert. Der Parent soll erst weiterarbeiten wenn er das Signal des Childs erhält.
Mein Problem ist das ich pause() nicht nutzen kann, weil ich auf ein spez. Signal warte (SIGUSR2) und sigpause() sollte nicht mehr verwendet werden. Ich habe im manual gelesen das stattdessen sigsuspend() verwendet werden soll, aber leider habe ich k.A. wie ich die Funktion richtig verwende.
Hier ist ein Auszug aus dem Quelltext, mit den relevanten Stellen:Auszug aus dem Parent-Programm ... switch(pidReadfile) { case -1: perror("fork"); exit(EXIT_FAILURE); case 0: execv(readfile,argvRead); default: printf("Should be printed after signal\n"); } ... Auszug aus dem Child-Programm ... err=kill(pidParent,SIGUSR2); if(err==-1) { perror("kill"); exit(EXIT_FAILURE); } ...
PS: Ich war mir nicht sicher ob ich dieses Thema unter Unix oder C posten sollte, falls es das falsche Subforum ist dann kann der Thread ja verschoben werden.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Niemand eine Idee wie ich auf das Signal mittels sigsuspend() warten kann?
-
Google: sigsuspend example
Was brauchst du mehr, als das, was du so findest? Da gibt es sogar unter den ersten Treffern ein Beispiel, wie man Eltern- und Kindprozesse synchronisieren kann.
-
Danke für deinen hilfreichen Beitrag, ich weiss wie man Google benutzt. Wäre ich damit erfolgreich gewesen hätte ich hier keinen Thread gestartet.
Ich hab probiert das so zu machen wie hier beschrieben: http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel4a.shtml
Aber mit dem gleichen Erfolg wie vorher, das heisst konkret, der Child-Prozess sendet das Signal aber der Parent hängt beim suspend und macht nix mehr. Ich poste hier jetzt einfach mal den unfertigen (ich wollte erst die Sync. ausprobieren) Quelltext:main.c
#include <stdio.h> #include <stdlib.h> #include <signal.h> int main() { int err=0; pid_t child; sigset_t signalmask1; sigemptyset(&signalmask1); sigaddset(&signalmask1,SIGUSR2); child=fork(); switch(child) { case -1: perror("fork"); exit(EXIT_FAILURE); case 0: printf("CHILD-PID: %d\n",getpid()); printf("PARENT-PID: %d\n",getppid()); err=kill(getppid(),SIGUSR2); if(err==-1) { perror("kill"); exit(EXIT_FAILURE); } printf("Signal was send!\n"); exit(EXIT_SUCCESS); default: sigsuspend(&signalmask1); printf("Signal received!\n"); break; } return EXIT_SUCCESS; }
-
Dann lies doch auch die Sachen, die da stehen, dann glaubt man dir auch, dass du Googlen kannst. sigsupsend benutzt man ganz anders. sigsuspend wartet, bis überhaupt ein Signalhandler aufgerufen wird. Da dies bei dir nie passiert, kann sigsuspend auch nie beenden.
Hättest du die verlinkten Beispiele gelesen, hättest du das auch gewusst. Und hattest, wie auch schon gesagt, sogar eine Komplettlösung für dein konkretes Problem gefunden.Also erst einmal Lesekompetenz erhöhen, bevor man motzt, besonders wenn man auf freiwillige Helfer angewiesen ist.
-
sigsuspend wartet, bis überhaupt ein Signalhandler aufgerufen wird
Das war ja das was mich stutzig gemacht hat. Ich hatte mich gefragt was der Signalhandler machen soll, wenn ich sowieso nur auf das Signal warte um den Prozess dann wieder zu starten. Der wäre ja dann sozusagen leer.
@SeppJ: Ich war halt etwas genervt, als einzige Antwort 'nen Einzeiler mit Googlelink zu erhalten. Am besten einfach mal etwas beruhigen, ist doch bald Weihnachten! :xmas2:
-
klingt.net schrieb:
sigsuspend wartet, bis überhaupt ein Signalhandler aufgerufen wird
Das war ja das was mich stutzig gemacht hat. Ich hatte mich gefragt was der Signalhandler machen soll, wenn ich sowieso nur auf das Signal warte um den Prozess dann wieder zu starten. Der wäre ja dann sozusagen leer.
Das übliche wäre zum Beispiel, eine Variable zu setzen, die dir dann zeigt, ob es auch das richtige Signal war. Falls du ohnehin alle Signale blockst außer dem auf das du wartest, dann reicht es natürlich auch, nichts zu tun.
-
klingt.net schrieb:
...ich weiss wie man Google benutzt...
Ich hab probiert das so zu machen wie hier beschrieben: http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel4a.shtml
Tja, offensichtlich kannst du doch nicht richtig googeln.
Anstatt den vorbereiteten Weg zu nehmen, hast du selber rumgegoogelt und dich dabei vergoogelt, denn du bist auf der Seite von Pfuscher JW gelandet, der bekanntlich nicht nur auf einem IT-Fachgebiet seinen Unsinn verbreitet.
-
Dieser verdammte JW, sein Schundwerk in Form eines Lehrbuches hab ich schon erfolgreich aus meinem Besitz entfernt. Wann bekommt dieser Mann endlich das Verbot eine Tastatur benutzen zu dürfen!