tengo estre programa en c pero nose acabarlo , lo que tengo compila y ejecuta , pero ejecuta mal xk no hace lo que tiene que hacer el caso es que por mas vueltas que doy no se me ocurre como arreglarlo ya, esplico de que va hay una lista de como mucho 10 clientes, estos hacen llamadas(asigandas por SIGUSR1) son atendidas por tres agentes , cada agente solo atiende un llamada si hay mas de 10 se ignoran, son atendidas por FIFO y las horas de todo i los id quedan regitradoe en un log
| Código: | # include <stdio.h>
# include <time.h>
# include <unistd.h>
# include <stdlib.h>
# include <pthread.h>
# include <sys/types.h>
# include <signal.h>
//Declaracion de estructuras//
struct cliente {
int idC;
int tiempo_espera,atendido;
};
struct agente {
int idA;
pthread_t thread_id;
int ocupado;
};
//-------------------------------//
//Declaracion de VG//
int cont ,huecos ;
FILE *logFile;
pthread_mutex_t semaforoClientes , semaforoAgentes , semaforoLog;
struct agente agentes[3];
struct cliente listaClientes [10];
void nuevaLlamada(int sig);
void *accionAgente(void *arg);
void *accionCliente(void *idC);
void escribirLog(char *id, char *msg);
//------------------------------//
void nuevaLlamada(int sig) {
if (signal(SIGUSR1, nuevaLlamada)==SIG_ERR) { // se realiza el handler de la señal
perror("Llamada a signal.");
exit(-1);
}
pthread_mutex_lock(&semaforoClientes);
int i ;
if ( huecos < 10){ //miramos si hay huecos para admitir la llaada
for ( i = 0 ; i < 10 ; i++){
if (listaClientes[i].idC == 0){ // si algun hueco de la lista tiene el id a 0 ai sitio
cont = cont +1;
listaClientes[i].idC = cont; // le asignamos un id
listaClientes[i].atendido = 0; // aun no esta atendido
huecos++; //queda un hueco menos
pthread_t t;
pthread_create (&t, NULL, accionCliente, (void*)&listaClientes[i].idC ); //creamos el cliente y paramos
break;
}
}
}else { // sino hay huecos el cliente que llamo se ignora con un id mas
cont = cont +1;
pthread_mutex_lock(&semaforoLog);
char stid[20];
sprintf(stid, "cliente_%d", cont);
escribirLog(stid, "se ha ignorado la llamada del cliente");
pthread_mutex_unlock(&semaforoLog);
}
pthread_mutex_unlock(&semaforoClientes);
}
void *accionCliente(void *Clientes){
int idCliente,i, l = 0;
idCliente = *(int*)Clientes;
pthread_mutex_lock(&semaforoLog);
char stid[20];
sprintf(stid, "cliente_%d", idCliente);
escribirLog(stid, "hora de inicio llamada"); // se escribe en el log la hora de la llamada con el id del cliente
pthread_mutex_unlock(&semaforoLog);
srand((int)pthread_self());
int x=(int)(10.0*rand()/RAND_MAX+1.0); // hace un numero aleatorio entre 0 y 9
for(i=0;i<10;i++) {
if(x==0) {
while(l<=60) { //calculamos los tiempos de espera porcentuales
if (listaClientes[i].atendido==1) {
break;
}
if(l==60){
pthread_mutex_lock(&semaforoLog);
sprintf(stid, "cliente_%d", listaClientes[i].idC);
escribirLog(stid, "El cliente ha colgado");
pthread_mutex_unlock(&semaforoLog);
break;
}
sleep(1);
l=l+1;
}
}
if((x==1) || (x==2)) {
while(l<=120) {
if(listaClientes[i].atendido==1) {
break;
}
if(l==120){
pthread_mutex_lock(&semaforoLog);
sprintf(stid, "cliente_%d", listaClientes[i].idC);
escribirLog(stid, "El cliente ha colgado");
pthread_mutex_unlock(&semaforoLog);
break;
}
sleep(1);
l=l++;
}
}
if ((x!= 0)&& (x != 1) && (x != 2)){
while(l<=180) {
if(listaClientes[i].atendido==1) {
break;
}
if(l==180){
pthread_mutex_lock(&semaforoLog);
sprintf(stid, "cliente_%d", listaClientes[i].idC);
escribirLog(stid, "El cliente ha colgado");
pthread_mutex_unlock(&semaforoLog);
break;
}
sleep(1);
l=l++;
}
}
}
pthread_mutex_lock(&semaforoClientes);
listaClientes[i].idC==0; //el cliente ya ha sido atendido, su id se torna cero para indicar un hueco libre
pthread_mutex_unlock(&semaforoClientes);
huecos = huecos - 1 ;
}
void *accionAgente (void *Agentes){
int j = 0 , k = 0, l = 0, min;
int idAgente = *(int*)Agentes;
//DUDA 1
for( j = 0; j < 10 ; j++){
if ( listaClientes[j].idC != 0 ){
min = listaClientes[j].idC;
break ;
}
}
for ( k = 0 ; k <10 ; k++){
if(listaClientes[k].idC != 0){
if ( listaClientes[k].idC < min ){
min = listaClientes[k].idC;
}
}
}
srand((int)pthread_self());
int x=1+(int)(30.0*rand()/RAND_MAX+10.0);
while(1){
pthread_mutex_lock(&semaforoClientes);
for ( l = 0; l < 10 ; l++){
if (listaClientes[l].idC == min){
listaClientes[l].atendido = 1;}
}
pthread_mutex_unlock(&semaforoClientes);
pthread_mutex_lock(&semaforoLog);
char stid[20];
sprintf(stid,"cliente_%d atendido por el agente_%d", listaClientes[l].idC, idAgente);
escribirLog(stid, "Hora de inicio de atención de la llamada");
pthread_mutex_unlock(&semaforoLog);
sleep(x);
pthread_mutex_lock(&semaforoLog);
sprintf(stid,"cliente_%d atendido por el agente_%d", listaClientes[l].idC, idAgente);
escribirLog(stid, "Hora de fin de atención de la llamada");
pthread_mutex_unlock(&semaforoLog);
pthread_mutex_lock(&semaforoClientes);
for ( l = 0; l < 10 ; l++){
if (listaClientes[l].idC == min){
listaClientes[l].atendido = 0;
listaClientes[l].idC= 0;
}
}
pthread_mutex_unlock(&semaforoClientes);
}
}
void escribirLog(char *id, char *msg) {
// Calculamos la hora actual
time_t now = time(0);
struct tm *tlocal = localtime(&now);
char stnow[20];
strftime(stnow, 20, "%d/%m/%y %H:%M:%S", tlocal);
// Escribimos en el log
logFile = fopen("callcenter.log", "a");
fprintf(logFile, "[%s] %s: %s\n", stnow, id, msg);
fclose(logFile);
}
int main(int argc, char* argv[]){
if (signal(SIGUSR1, nuevaLlamada) == SIG_ERR) { // se llama a SIGUSR1
perror("Llamada a signal.");
exit(-1);
}
pthread_mutex_init(&semaforoClientes, NULL); //Inicializacion de los semaforos
pthread_mutex_init(&semaforoLog, NULL);
cont = 0 ;
huecos = 0;
pthread_mutex_lock(&semaforoClientes);
int i;
for ( i = 0 ; i < 10 ; i++){
listaClientes[i].idC=0;
listaClientes[i].atendido=0;
}
int idA1 = 1;
int idA2 = 2;
int idA3 = 3; //duda 2
agentes[0].ocupado = 0; //inicialización del log ¿Como se realiza?
agentes[1].ocupado = 0; //inicialización del log ¿Como se realiza?
agentes[2].ocupado = 0; //inicialización del log ¿Como se realiza?
pthread_mutex_unlock(&semaforoClientes);
pthread_create(&agentes[0].thread_id, NULL, accionAgente, (void*)&idA1);
pthread_create(&agentes[1].thread_id, NULL, accionAgente, (void*)&idA2);
pthread_create(&agentes[2].thread_id, NULL, accionAgente, (void*)&idA3);
while(1){
pause();
}
return 0;
}
|
|