Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

Paulo Almeida

Message Queues;

Mensagens Recomendadas

Paulo Almeida    0
Paulo Almeida

Boa noite,

Sou novo aqui e fui recomendado há poucos minutos por um amigo para colocar neste fórum as minhas dúvidas de programação.

Tenho um trabalho para entregar (com alguma urgência - até às 24h de hoje) de uma cadeira de sistemas operativos, em linguagem C.

O problema está descrito no seguinte enunciado:

"Write 2 processes, a sender and a receiver, where each process is

a separate program. The sender should send an input file to the receiver using POSIX:XSI message

queues (msgget(), etc). The receiver should save the received file in an output file. The maximum

number of bytes in the data field of each message transmitted by the sender or by the receiver

is given by a macro MAX_BYTES, which should be defined using a “#define” directive (for example:

“#define MAX_BYTES 10”). The program should be compliant to the fact that the users may freely

change the value of “MAX_BYTES” to any positive integer before compiling the programs. The sender

should separately read from the input file the data bytes to be sent in each individual message. The

receiver should separately write to the output file the data bytes received in each individual message.

The input and output file names should be specified as the first command line argument to the sender

process and to the receiver process, respectively. It is assumed that the names of the input and output

files are different. After running the processes, the input and output files should have the same contents.

An example of how the two processes can be run is as follows:

shell_1_prompt$ ./receiver file_out.txt

Receiver: file reception and saving is now complete.

...

shell_2_prompt$ ./sender file_in.txt

Sender: file reading and sending is now complete."

O meu código para a solução do problema é o seguinte:

SENDER:

/*-----------------------------------------------------------------------*/

/* sender.c */

/*-----------------------------------------------------------------------*/

/* Compilation: gcc -Wall sender.c -o sender */

/*-----------------------------------------------------------------------*/

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#include <string.h>

#include <errno.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <math.h>

/*-----------------------------------------------------------------------*/

/* macro definitions */

/*-----------------------------------------------------------------------*/

#define MAX_BYTES 10 /* assume it is enough */

/*-----------------------------------------------------------------------*/

/* type definitions */

/*-----------------------------------------------------------------------*/

struct message_structure{

long type;

char data[MAX_BYTES]; //portion of file data with size = MAX_BYTES (may

//be defined freely by user)

int szf;

};

int fsize();

/*-----------------------------------------------------------------------*/

/* main() */

/*-----------------------------------------------------------------------*/

int main(int argc, char *argv[]){

struct message_structure message;

int msqid; //Message queue ID

key_t key; //key is a system-wide unique ID the queue you want to connect to (or create)

//Every other process that wants to connect to this queue will have to use the same key

FILE *fp; //File pointer to the file

key=1234;

message.type = 1; /* we don't really care in this case */

//msgget() - get a System V message queue identifier

if((msqid = msgget(key, 0600 | IPC_CREAT)) == -1){

perror("msgget");

exit(1);

}

// fopen() - opens the file whose name is the string pointed to by path and associates a stream with it.

fp=fopen(argv[1], "r");

message.szf = fsize(fp) / MAX_BYTES;

printf("nº de pacotes");

printf("%d\n",message.szf);

int i;

for(i=0; i<=message.szf; i++){

if((fread(&message.data, 1, MAX_BYTES, fp)) == -1){

perror("fread");

exit(1);

}

//msgsnd() - System V message queue operation

if(msgsnd(msqid, &message, MAX_BYTES, 0) == -1){

perror("msgsnd");

exit(1);

}

}

/*

// msgctl() - System V message control operations

if(msgctl(msqid, IPC_RMID, NULL) ==-1){

perror("msgctl");

exit(1);

}

*/

printf("Sender: file reading and sending is now complete.\n");

fclose(fp);

return 0;

}

int fsize(FILE *fp){

int prev=ftell(fp);

fseek(fp, 0L, SEEK_END);

int sz=ftell(fp);

fseek(fp,prev,SEEK_SET); //go back to where we were

return sz;

}

RECEIVER:

/*-----------------------------------------------------------------------*/

/* receiver.c */

/*-----------------------------------------------------------------------*/

/* Compilation: gcc -Wall receiver.c -o receiver */

/*-----------------------------------------------------------------------*/

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#include <string.h>

#include <errno.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

/*-----------------------------------------------------------------------*/

/* macro definitions */

/*-----------------------------------------------------------------------*/

#define MAX_BYTES 10 /* assume it is enough */

/*-----------------------------------------------------------------------*/

/* type definitions */

/*-----------------------------------------------------------------------*/

struct message_structure{

long type;

char data[MAX_BYTES]; //portion of file data with size = MAX_BYTES (may

//be defined freely by user)

int szf;

};

/*-----------------------------------------------------------------------*/

/* main() */

/*-----------------------------------------------------------------------*/

int main(int argc, char *argv[]){

struct message_structure message;

int msqid; //Message queue ID

key_t key = 1234; //key is a system-wide unique ID the queue you want to connect to (or create)

//Every other process that wants to connect to this queue will have to use the same key

FILE *fp; //FILE pointer to the file

//msgget() - get a System V message queue identifier

if((msqid = msgget(key, 0600 | IPC_CREAT)) == -1){ /* connect to the queue */

perror("msgget");

exit(1);

}

fp = fopen(argv[1], "w");

printf("Receiver: ready to receive messages...\n");

int counter = 0;

do{ //receiver fica à espera de mensagens constantemente

//msgrcv() - to receive messages from a System V message queue

if(msgrcv(msqid, &message, sizeof(message), 1, 0) == -1){

perror("msgrcv");

printf("Error receiving the message.\n");

exit(1);

}

if(fwrite(&message.data, 1, sizeof(message.data), fp) == -1){

perror("fwrite");

exit(1);

}

}while(counter < message.szf);

printf("Receiver: file reception and saving is now complete.\n");

fclose(fp);

return 0;

}

//========================================================

O programa está a devolver erro no terminal RECEIVER.

Se alguém me puder ajudar a por isto a funcionar agradecia.

Obrigado.

Cumprimentos.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo    1153
HappyHippyHippo

1º - se te dá erro, era de bom tom dizer qual era o erro

2º - reparaste que tens um ciclo para receber mas não tens um para enviar ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.