У меня есть следующий текст, который указывает, что: У меня есть один процесс, называемый 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);
}
' ''