как дождаться завершения активных потоков в обработчике сигнала SIGHUP в C? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть следующий текст, который указывает, что: У меня есть один процесс, называемый supermercato, поскольку в супермаркете есть поток C, в котором клиент делает магазин, и поток K платежных автоматов. В тексте говорится, что процесс supermercato может завершиться двумя способами: 1) получен сигнал SIGQUIT, процесс мгновенно завершится (я должен был сделать обработчик только с несколькими безопасными функциями, как вы можете видеть в коде). 2) Получен сигнал SIGHUP, на этом этапе мне нужно дождаться, пока активные клиенты не закончат делать покупки, а затем я могу закрыть процесс супермаркета, но я понятия не имею, как это сделать. Я думал использовать pthread_kill () и управлять сигналом непосредственно клиентскому потоку или использовать pthread_cancel () '' '. Я также прочитал C (количество клиентов в супермаркете) из файла config.txt, и я не знаю, как передать C в качестве параметра обработчику (мне нужно это сделать, я '' м не очень уверен). Я написал только "основной" процессный супермаркет, потому что это проект. Вот код

'' '

// ec_meno1, ec_NULL, ec_zero определены МАКРОСОМ для управления errno

static void SIG_handler(int signum){
      switch(signum){
      case SIGQUIT: write(1,"Ricevuto SIGQUIT\n",18);
                    _exit(EXIT_FAILURE);
                    break;
      case SIGINT: ??       
      }
}


void supermercato(const char* path){
int max=2,i=0;
int var[100],C,K;
FILE *in = NULL;
    char *line = malloc(sizeof(char*)*256);
    ec_null(in=fopen(path,"r"),"fopen failed");

    while(fgets(line,sizeof(line),in) != NULL && max > 0){
        int j = atoi(line);
        var[i] = j;
        i++;
        max--;  
    }    
    K=var[0];
    C=var[1];
    fclose(in);

    pthread_t *th_clienti = malloc(C*sizeof(pthread_t));
    pthread_t *th_casse = malloc(K*sizeof(pthread_t));
pthread_t *th_d;   

    for(int k=0;k<K;k++){
        ec_zero(pthread_create(&th_clienti[i], NULL,cliente, NULL),"pthread_create failed");
    }
    for(int c=0;c<C;c++){
        ec_zero(pthread_create(&th_casse[i], NULL,cassiere, NULL),"pthread_create failed");
    }
    ec_zero(pthread_create(&th_d, NULL,direttore, NULL),"pthread_create failed");

    //gestione segnali
    struct sigaction s;
    memset(&s,0,sizeof(s));
    s.sa_handler=SIG_handler;
    ec_meno1(sigaction(SIGQUIT,&s,NULL),"sigaction failed");
    ec_meno1(sigaction(SIGINT,&s,NULL),"sigaction failed"); 



    free(th_casse);
    free(th_clienti);
    free(th_d);
    free(line);
 }

' ''

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...