Skip to content

Commit

Permalink
Merge pull request #11 from FAILD
Browse files Browse the repository at this point in the history
Checking the existence of fifo and some other enhancements
  • Loading branch information
goncaloacteixeira committed Apr 30, 2020
2 parents 995704d + ca63261 commit 405eda4
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 21 deletions.
9 changes: 8 additions & 1 deletion projects/project_2/stage1/Q1.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,13 +75,20 @@ int main(int argc, char** argv) {
timeout = args.seconds * 1000;
clock_gettime(CLOCK_MONOTONIC_RAW, &start);

while (delta() < timeout) {
while (delta() < timeout) {
message_t request;
while (read(fd, &request, sizeof(message_t)) <= 0 && delta() < timeout) {
usleep(10000);
}
/* Esta linha verifica se o tempo já passou devido ao usleep
* assim evita ler duas vezes a mesma mensagem */
if (delta() >= timeout) break;
pthread_t tid;
pthread_create(&tid, NULL, thr_function, &request);
/* thread_join para esperar que a thread termine antes de sair
* assim todos os pedidos recebidos a tempo são processados de
* forma correta */
pthread_join(tid, NULL);
}

close(fd);
Expand Down
38 changes: 30 additions & 8 deletions projects/project_2/stage1/Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,32 @@ typedef struct {
char* server_fifo;
} client_args_t;
```
- Criação de uma struct para armazenar os argumentos passados pelo programa Q2
- Criação de uma struct para armazenar os argumentos passados pelo programa Q1

```C
typedef struct {
int seconds;
char* server_fifo;
} client_args_t;
int nplaces; // 0 na primeira parte
int nthreads; // 0 na primeira parte
char* fifoname;
} server_args_t;
```

- Criaçaõ de uma struct para armazenar as informações de um pedido ou de uma resposta

```C
typedef struct {
/* ID do pedido -> começa em zero */
int id;
/* process ID no pedido atual */
pid_t pid;
/* thread ID no pedido atual */
int tid;
/* duração do acesso ao servidor (pedido pelo cliente) em microseconds (para facilitar o uso de usleep) */
int dur;
/* posição atribuida pelo servidor ao cliente (-1 no pedido) */
int pl;
} message_t ;
```

## Funções
Expand All @@ -35,13 +54,16 @@ typedef struct {
void log_message(int i, pid_t pid, pid_t tid, int dur, int pl, char *oper);
```
- Criação de um função responsável por devolver há quanto tempo o programa corre e assim verificar se já atingiu o final da execução
```C
double delta();
```

## Linhas de código relevantes

- Geração de durações (pseudo)aleatórias para o acesso do cliente ao quarto de banho
- Geração de durações (pseudo)aleatórias para o acesso do cliente ao quarto de banho, em milisegundos

```C
int microseconds = 1000;
request.dur = (rand() % ((5 * microseconds) - (1 * microseconds) + 1)) + (1 * microseconds);
request.dur = (rand() % (100 - 20 + 1)) + 20;
```

Nota: A duração está a ser gerada em microsegundos uma vez que estamos a usar a função usleep.
28 changes: 16 additions & 12 deletions projects/project_2/stage1/U1.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <signal.h>

#include "utils.h"

int server;
struct timespec start;

char * server_path;

void* thr_function(void* arg) {
pid_t tid;
Expand All @@ -30,17 +31,18 @@ void* thr_function(void* arg) {
write(server, (message_t *) arg, sizeof(message_t));
log_message(((message_t*) arg)->id, ((message_t*) arg)->pid, ((message_t*) arg)->tid, ((message_t*) arg)->dur, ((message_t*) arg)->pl, "IWANT");

/*
* TODO - Se já não for possivel obter uma resposta do servidor emitir o código "FAILD"
* Possivelmente: Determinar se o fifo ainda está aberto em cada itereação do while
*/

message_t reply;
while (read(client, &reply, sizeof(message_t)) <= 0) {
usleep(10000); /* enquanto não tiver uma resposta do servidor */
signal(SIGPIPE, SIG_IGN);
if(access(server_path, F_OK) != -1) {
message_t reply;
int counter = 0;
while (read(client, &reply, sizeof(message_t)) <= 0 && counter < 5) {
usleep(10000);
counter++;
}
log_message(reply.id, getpid(), tid, reply.dur, reply.pl, (reply.pl != -1) ? "IAMIN" : "CLOSD");
} else {
log_message(((message_t*) arg)->id, ((message_t*) arg)->pid, ((message_t*) arg)->tid, ((message_t*) arg)->dur, ((message_t*) arg)->pl, "FAILD");
}

log_message(reply.id, getpid(), tid, reply.dur, reply.pl, (reply.pl != -1) ? "IAMIN" : "CLOSD");

close(client);
unlink(client_fifo);
Expand All @@ -56,6 +58,7 @@ int main(int argc, char** argv) {
exit(1);
}
client_args_t args = parse_client_args(argv);
server_path = args.server_fifo;

do {
server = open(args.server_fifo, O_WRONLY);
Expand All @@ -77,11 +80,12 @@ int main(int argc, char** argv) {

/* o tempo aqui fica em ms para ser mais simples de verificar se o cliente ainda
* tem tempo para aceder ao servidor */
request.dur = (rand() % (5 - 1 + 1)) + 1;
request.dur = (rand() % (100 - 20 + 1)) + 20;
request.id = request_id++;
request.pl = -1;

pthread_create(&tid, NULL, thr_function, &request);
pthread_join(tid, NULL);
usleep(100000);
}

Expand Down

0 comments on commit 405eda4

Please sign in to comment.