Ajuda em Código C [RESOLVIDO]

1. Ajuda em Código C [RESOLVIDO]

Gustavo Lazarotto Schroeder
gSchroeder

(usa Ubuntu)

Enviado em 16/06/2015 - 14:08h

Olá Amigos,
Necessito de ajuda no código abaixo, não entendi sua lógica.


#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

struct data {
int a; char b[10]; long c;
};

const int N = 4096*2;


int main() {
int fd;
struct data *addr;
fd = shm_open("/xyz", O_RDWR | O_CREAT, 0600);
ftruncate(fd, N);
addr = mmap(NULL, N, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
addr->a = 5;
addr->b[3] = 'C';
addr->c = 0xffff;
munmap(addr, N);
}



Obrigado!


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 16/06/2015 - 15:23h

gSchroeder escreveu:

Olá Amigos,
Necessito de ajuda no código abaixo, não entendi sua lógica.


#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

struct data {
int a; char b[10]; long c;
};

const int N = 4096*2;


int main() {
int fd;
struct data *addr;
fd = shm_open("/xyz", O_RDWR | O_CREAT, 0600);
ftruncate(fd, N);
addr = mmap(NULL, N, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
addr->a = 5;
addr->b[3] = 'C';
addr->c = 0xffff;
munmap(addr, N);
}



Obrigado!


Uma vez que se leia a documentação de shm_open(), parece-me muito óbvio. O programa acede a (cria uma nova, se ainda não existir) uma região de memória de memória compartilhada identificada pelo nome /xyz, define seu tamanho em 8192 bytes, aponta um ponteiro para o começo dessa região compartilhada e, através de acesso aos elementos referenciados pelo ponteiro, altera alguns valores da memória compartilhada. Quando o programa termina, a memória compartilhada permanece ativa para o SO.

3. Re: Ajuda em Código C [RESOLVIDO]

Gustavo Lazarotto Schroeder
gSchroeder

(usa Ubuntu)

Enviado em 16/06/2015 - 16:05h


Obrigado Paulo!

Por exemplo, se eu fizer um outro programa que também deseja mexer nesta região, teria que declarar o Struct no outro programa também? Ou necessitaria apenas os ponteiros?


4. Re: Ajuda em Código C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 16/06/2015 - 22:26h

gSchroeder escreveu:

Por exemplo, se eu fizer um outro programa que também deseja mexer nesta região, teria que declarar o Struct no outro programa também? Ou necessitaria apenas os ponteiros?


Acho que é você quem deve dizer, pois depende do que você quer representar nessa memória.

O programa que você mostrou é só um caso de testes, que inclusive usa um bloco de memória muito maior do que o tipo do dado do ponteiro empregado para aceder a ele. Mesmo assim, dá para ver que usar a estrutura tem a vantagem de ajudar você a identificar, através dos nomes dos campos, em qual pedaço da memória está cada coisa, sem correr o risco de se confundir ou de misturá-las.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts