Signal Probleme, Signal wird nur ein mal eingefangen was mach ich falsch?.
-
Ok als erstes sorry fur den langen code
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <fcntl.h> typedef void (*sighandler_t)(int); void InstalShit(void); char *my_itoa_x(int IntIn) { char *ReturnA; // ReturnA = NULL; ReturnA = malloc(255*8); if(ReturnA == NULL) { fprintf(stderr,"Guru Meditation : bye.\n"); exit(-1); } sprintf(ReturnA, "%d", IntIn); return ReturnA; } static sighandler_t MySignal(int SigNr, sighandler_t SignalHandler) { struct sigaction NewSig; struct sigaction OldSig; NewSig.sa_handler = SignalHandler; sigemptyset (&NewSig.sa_mask); NewSig.sa_flags = SA_RESTART; if (sigaction(SigNr, &NewSig, &OldSig) < 0) { return SIG_ERR; } return OldSig.sa_handler; } static sighandler_t SignalAdd(int SigNr, sighandler_t SignalHandler) { struct sigaction AddSig; if (sigaction (SigNr, NULL, &AddSig) < 0) { return SIG_ERR; } AddSig.sa_handler = SignalHandler; sigaddset(&AddSig.sa_mask, SigNr); AddSig.sa_flags = SA_RESTART; if (sigaction(SigNr, &AddSig, NULL) < 0) { return SIG_ERR; } return AddSig.sa_handler; } char **GlobalArg(void) { static char *GlobalArgVar = NULL; return &GlobalArgVar; } void ReadAndSeek(void) { char *ReadIn; char *PidID; ReadIn = NULL; ReadIn = malloc(1024 * sizeof(char) ); PidID = my_itoa_x( getpid() ); if(ReadIn == NULL) { printf("Error.\n"); exit(-1); } if(read(0, ReadIn, 1024 * sizeof(char)) < -1) { printf("Guru Meditation : entopistike kapxio la8os.\n"); exit(-1); } if(strstr(ReadIn, PidID) == NULL) { write(1, ReadIn, strlen(ReadIn) -1); write(1, " ", 2*sizeof(char)); write(1,PidID, strlen(PidID)); write(1, "\n", 2*sizeof(char)); } else { write(2, ReadIn, strlen(ReadIn)); } free(ReadIn); free(PidID); } static void SigFunkSIGUSR1(int SigNr) { char *PidString; if(SigNr != SIGUSR1) { perror("Guru Meditation not SIGUSR1\n"); exit(1); } PidString = my_itoa_x(getpid()); write(1, PidString, strlen(PidString)); write(1,"\n", sizeof("\n")); free(PidString); PidString = NULL; } static void SigFunkSIGUSR2(int SigNr) { if(SigNr != SIGUSR2) { exit(1); } write(1, *GlobalArg(), strlen(*GlobalArg()) ); write(1,"\n", sizeof("\n")); } void SigFunk(int SigNr) { switch(SigNr) { case SIGUSR1: { SigFunkSIGUSR1(SigNr); break; } case SIGUSR2: { SigFunkSIGUSR2(SigNr); break; } default: { exit(-1); } } while(0xDEEDBEEF == 0xDEEDBEEF) { ReadAndSeek(); } } void InstalShit(void) { MySignal(SIGUSR1, SigFunk); MySignal(SIGUSR2, SigFunk); } int main(int argc, char **argv) { *GlobalArg() = malloc(1024*sizeof(char)); strcpy(*GlobalArg(),"0xDEED BEEF"); InstalShit(); //CheckArguments(argc,argv); //sigsuspend(); pause(); return 0; }
Nun wenn ich kill -USR1 <pid> sende wird der heandler ausgefürt, wenn ich dann noch mal das signal sende kill -USR1 <pid> sende geschied nicht!!. Das selbe passiert auch bei kill -USR2. Siht einer was ich werd noch verükt !!!
-
Also wenn ich kill -USR1 <pid> zum ersten mal sende wird der handler ausgefuhrt wenn ich dann noch mal kill -USR1 <pid> sende wird der handler nicht mwehr ausgefuhrt.