myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

C Signal Handler

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 28.06.12, 14:03   #1
Huugo
Anfänger
 
Registriert seit: Jul 2010
Beiträge: 2
Bedankt: 0
Huugo ist noch neu hier! | 0 Respekt Punkte
Standard C Signal Handler

Hallo Leute

Ich muss ein C Programm schreiben welches folge Aufgabenstellung erfüllt (Umgebung Unix(Free BSD)):

Signal–Handling (Signale küunstlich erzeugen)
Benutzen Sie Ihr Programm sigtest2 als Grundlage für ein Programm sigtest3, das
mit einem erhöhten Parameter für sleep() arbeitet, um vier der in der Vorlesung
angegebenen Signale zu simulieren. Hierbei bedeutet Simulieren nicht, dass mit Hilfe
von kill oder kill() die jeweilige Signalnummer erzeugt wird. Vielmehr sollen beim
Ablauf des Programms sigtest die Bedingungen erzeugt werden, die zum Senden des
Signals führen, etwa dass ein Alarmtimer abläuft (siehe alarm(3)).


Code von sigtest2.c


Wollte folgende Signale produzieren:
  • SIGALRM
  • SIDCHLD
  • SIGFPE
  • SIGSEGV

Das auslösen der Signale ist in erster Linie nicht mein Problem, sondern ich kann das Signal SIGCHLD und das Signal SIGALRM ohne probleme auslösen.
wenn ich nun noch das Signal SIGFPE oder SIGSEGV auslöse, bekomme ich eine Endlosschleife. Unterbreche ich diese mittels " signal(signo,SIG_IGN)" beendet sich mein programm.

Hat von euch jemand eine idee was ich noch tun kann um alle 4 Signale hinter einander Abzufeuern ohne das sich das Programm beendet oder in eine Endlosschleife gerät?

Schon mal danke im vorraus.

Gruß Huugo
Huugo ist offline   Mit Zitat antworten
Ungelesen 28.06.12, 15:30   #2
Your_Conscience
Hinter dir!
 
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
Your_Conscience ist noch neu hier! | 0 Respekt Punkte
Standard

Ich habe leider kein Linux zur Verfügung und somit fehlen mir leider einige Headerdateien, um das Projekt zu compilieren und zu testen.

Falls dir hier sonst niemand helfen kann, poste einfach mal dein den Quellcode von deinem Projekt und beschreibe mal, an welcher Stelle es sich ungefähr aufhängt.

Ansonsten: schonmal mit einem Debugger überprüft?
Your_Conscience ist offline   Mit Zitat antworten
Ungelesen 28.06.12, 15:59   #3
spartan-b292
Echter Freak
 
Benutzerbild von spartan-b292
 
Registriert seit: Mar 2010
Ort: /home/spartan-b292
Beiträge: 2.856
Bedankt: 1.701
spartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punktespartan-b292 leckt gerne myGully Deckel in der Kanalisation! | 230828 Respekt Punkte
Standard

Ich würde mal auf folgendes Problem Tippen:

Nach dem du deinen Signalhandler aufgerufen hast, kommst du wieder an die Stelle im Code, die das Aufrufen des Signalhandlers verursacht hat. Da du dann aber wieder eine Division durch 0 durchführst, springt dein Programm wieder in den Signalhander.

Eine einfache Lösung wäre im Signalhandler die Variablen so zu verändern, dass du nicht mehr durch 0 dividierst. In deinem Beispiel dann b>0.

Alternativ könnte man noch mit setjmp/longjmp (in setjmp.h) arbeiten, die Division aber zu "korriegieren" wäre die einfachere Möglichkeit.

Trotzdem mal den Code liefern
__________________
"They who can give up essential liberty to obtain a little temporary safety, deserve neither liberty nor safety"
spartan-b292 ist offline   Mit Zitat antworten
Ungelesen 28.06.12, 17:05   #4
germgerm
bla
 
Registriert seit: Mar 2010
Beiträge: 312
Bedankt: 302
germgerm ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Zitat von Huugo Beitrag anzeigen
Das auslösen der Signale ist in erster Linie nicht mein Problem, sondern ich kann das Signal SIGCHLD und das Signal SIGALRM ohne probleme auslösen.
wenn ich nun noch das Signal SIGFPE oder SIGSEGV auslöse, bekomme ich eine Endlosschleife. Unterbreche ich diese mittels " signal(signo,SIG_IGN)" beendet sich mein programm.
Bist du sicher, dass das Programm nicht öfters gestartet werden darf?
Kann ich hier nicht rauslesen; ich würde beim Programmstart Parameter mitübergeben, welcher Alarm gestestet werden soll, ein Switch und fertig.
germgerm ist offline   Mit Zitat antworten
Ungelesen 28.06.12, 18:38   #5
Huugo
Anfänger
 
Registriert seit: Jul 2010
Beiträge: 2
Bedankt: 0
Huugo ist noch neu hier! | 0 Respekt Punkte
Standard

Danke germgerm auf die idee bin ich noch nich gekommen
Dachte es liegt an meinen bescheidenen C Kentinissen, da ich sonst fast nur Java programmiere.

Hier noch der funktionierende Code für alle die es interessiert
Code:
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>


void childProcess();
volatile int signo = 0;
volatile int a=10;
volatile int b=0;
volatile int c;
void childProcess(){
	int pid;
   	pid = fork();
 
   	if (pid == 0){
      		/* Childprocess*/
        	sleep (1);   
      		exit (5);
   	}else if (pid > 0){ 
      		/* Parentprocess*/  
   	}else{   
      		/*Error by fork()*/
      		fprintf (stderr, "Error");
      		exit (1);
   	}
}
static void pSigHandler(int sig){

	printf("Wake up call ... !!! - Catched signal: %d ... !!\n", sig);
	if((sig==SIGFPE)||(sig==SIGSEGV)){
		/*wihtout ignoring SIGFPE, infinity loop*/
		signal(SIGFPE,SIG_IGN);
		signal(SIGSEGV,SIG_IGN);
	}
	signo=sig;
}
 
int main(int argc, char* argv[])
{
   int i;
   int *s=0;

   	/*Parentprocess*/
   	struct sigaction psa;
   	psa.sa_handler = pSigHandler;

	for ( i = 0; i < 32; i++ ) {
		sigaction(i, &psa, NULL);
	}
   		
   	if(argc<=1){
		printf("No signal choosed\n");	
	}else{		
		int param=atoi(argv[1]);
   		switch(param){
   			case 1: 
   				 /*Timer has run down errorsignal*/
   				alarm(5);
   			break;
   				
   			case 2: 
   				/*Divide by zero errorsignal*/
   				c=a/b;
   			break;	
   			
   			case 3: 
   				/*Child has canged errorsignal*/
   				childProcess();
   			break;	
   			
   			case 4:	
   				/*Segmentation fault errorsignal*/			
   				*s=0;
   			break;	
   		}   
  	}
  
  
   while(sleep(5)){}
  
   printf("signal number (zero if no signal): %d\n",signo);
    
   return 0;

}
Huugo ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 Uhr.


Sitemap

().