Linux - obsługa sygnału i powrót do dalszego wykonywania funkcji

0

Witam, mam dwa procesy typu producer i consumer (reprezentowane przez metody o tej nazwie). Procesy komunikują się za pomocą FIFO, producer wysyła sygnał do consumera który po jego otrzymaniu ma odczytać FIFO. Problem polega na tym że po wysłaniu sygnał dochodzi do funkcji jego obsługi i nie kontynuuje działania w procesie consumera. A chciałbym najpierw wykonać kod producera wysłać sygnał, a następnie go odebrać u consumera, obsłużyć i kontynuować kod consumera. Pominąłem część kodu by nie komplikować sytuacji.

int PID;

void handler(int sig)
{
    printf("SIGTSTP %d\n", sig);

}

void consumer(){
  PID = getpid();
  
  while(1){
  signal(SIGTSTP, handler); 
  // kod consumera
  }

}
void producer(){
  while(1){
  // kod producera
  kill(PID, 20);

  }
}

int main(int argc, const char *argv[]){
	if(argc == 3) {
                if(strcmp(argv[2],"CLIENT")) {                  
		consumer(); 
                } else { 
                producer(); 
                }
                exit(0);
        }
        umask(0);
        mknod(FIFO, S_IFIFO|0666, 0);
        if(fork()) {
                execl(argv[0], argv[0], FIFO, "SERVER", NULL); 
        } else {
                execl(argv[0], argv[0], FIFO, "CLIENT", NULL);
        }
        return 0;
}

1

Jaką wartość ma PID w metodzie producer()?

0

Sprawdziłem i ma wartość 0, więc sygnał nie wędruje do tego procesu :(
@Delor czyli getpid() w forku ?

1

PID = fork();
Po forku procesy będą operować na innych obszarach pamięci.

Cały czas rozpatruj dwie sytuacje:

  1. serwer wykonuje się przed klientem
  2. klient wykonuje się przed serwerem
0

@Delor:
Dziękuje, teraz działa poprawnie. Muszę jeszcze dokładnie przeanalizować cały proces by to dokładnie zrozumieć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1