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.


Anmelden zum Antworten