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

Linux - obsługa sygnału i powrót do dalszego wykonywania funkcji
TC
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 49
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.

Kopiuj
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;
}

Delor
  • Rejestracja: dni
  • Ostatnio: dni
1

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

TC
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 49
0

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

Delor
  • Rejestracja: dni
  • Ostatnio: dni
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
TC
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 49
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.