.:: Jorge Pereira ::.

- Mais um Brasileiro na fundação GNOME

GNOME

Pois bem,

Ontem assim que cheguei no trabalho fui checar meu e-mail pessoal quando havia uma mensagem da GNOME Foundation[1] informando que eu havia sido aceito como o mais novo membro da fundação, uma excelente noticia logo de manhã cedo! Com isto passo a ser o décimo quarto desenvolvedor brasileiro a fazer parte da fundação GNOME; Fazendo parte do comitê de votação para diretoria da fundação, podendo colaborar com sugestões, etc. Atualmente temos a seguinte lista[2] com todos os membros oficiais da fundação espalhados pelo mundo! :)

Em todos os eventos que participei anteriormente, alguns deles foram em prol da divulgação e focando na ajuda com aqueles que tem interesse em conhecer e colaborar com o desenvolvimento, tradução ou qualquer outro tipo de colaboração com o mais famoso gerenciador de janelas para Linux chamado GNOME. Podem ser acessadas algumas das apresentações na parte de eventos no wiki do GNOME Brasil[3].

Aproveitando para dizer que o Brasil possui um dos times com maior atuação no desenvolvimento do projeto GNOME, podem ser acessadas mais informações sobre o GNOME aqui no Brasil através do portal[4], se você tem interesse vale a pena visitar o portal e descobrir como fazer parte da equipe; O último relatório sobre a atuação do GNOME Brasil pode ser visto no portal[5] além do famoso Planeta GNOME Brasil[6], entre lá e conheça alguns dos desenvolvedores brasileiros!

Já tem algum tempo que venho me dedicando ao desenvolvimento do GNOME no seu modulo do servidor VNC, mais conhecido como VINO. Abaixo algumas das minhas colaborações com novas features e bug fixies.

2008-11-25  Jorge Pereira <jorge@jorgepereira.com.br>
        ...
	* server/vino-background.h:
	Disable wallpaper on connection + restart = wallpaper gone
	forever. Closes #562281.

2008-11-25  Jorge Pereira <jorge@jorgepereira.com.br>
        ...
	* server/vino-server.schemas.in:
	Removed the feature localOnly, added correct support for IPv4 mapped
	IPv6, and added a new feature to able to set network interface for
	accept connection. Closes #403183,#403192,#488354.

2008-07-29  Jonh Wendell
        ...
	* configure.in: Added a compile-time option (--enable-libunique)
	to use the LibUnique library, which allows only one instance of
	capplet running.
	Based on a patch provided by Jorge Pereira .

2008-07-25  Jorge Pereira <jorge@jorgepereira.com.br>
        ...
	* server/vino-server.schemas.in:
	New feature to disable wallpaper when connected to vino.
	Close #515072.

2008-07-06  Jorge Pereira <jorge@jorgepereira.com.br>
        ...
	* configure.in:
	Added a tool to change Vino password, similar to Unix passwd command.
	Closes #540853.

Sem esquecer de agradecer ao Jonh pela força! let’s do it! keep happy hacking!! ;)

- The physics factbook

A alguns dias atrás eu estava vendo alguns emails em uma das listas que participo quando em um deles havia um link para o The physics factbook, um site muito legal feito por vários hackers, físicos, gamers e afins que resolveram criar uma fonte contendo as mais incríveis formulas matemáticas sobre cenas de jogos, games, filmes, eletricidade, gravidade, entre os mais variados fatos que se possa imaginar!

Alguns dos mais interessantes em minha opinião é o abaixo sobre a força da gravidade no clássico Mario Brother.

Abstract

The purpose of this analysis is to determine the evolution of gravity in the Mario video game series as video game hardware increases.

Introduction

Gravity is force which is responsible for keeping us on the ground. It is also the force that prohibits us from jumping 50 feet in the air. However, in Mario’s world, gravity does not quite work that way. Mario is able to jump 5 times his height and fall with accelerations that would be deadly to humans.

We will find Mario’s acceleration due to gravity by using the formula

s = s0 + v0t + ½ at2

where s is the distance he falls, s0 is his initial distance, which is 0, v0 is his initial vertical velocity, which is also 0, a is his acceleration due to gravity, and t is the time it takes for him to fall. When we solve this formula for a, we get

a = 2s / t2

Este falando sobre a velocidade do metrô no filme Batman Begins

Abstract

The purpose of our experiment is to determine the speed of a subway car in the movie Batman Begins.

Introduction

The movie that the calculations were based on was Batman Begins directed by Christopher Nolan and starring Christian Bale as Batman, Michael Caine as Alfred Pennyworth, and Gary Oldman as James Gordon). Having witnessed the death of his millionaire parents, young Wayne travels to the East after fate diminished his only chance of revenge. There, he seeks counsel of the leader of an honorable ninja cult, Ra’s Al-Ghul. Years later, he returns to Gotham to find it full of crime. With his company at stake, he turns to the cave under his mansion and becomes Batman, a shadow that strikes fear into the hearts of criminals. With the help of James Gordon, Batman sets out to take down various individuals, such as Falcone, the “scarecrow” and Ra’s Al-Ghul, who were notorious for creating the biggest crime streaks and dangers of Gotham.

|| Mais links!

- O Fim do rm -rf /

rm -rf /

Algumas pessoas que me conhecem sabem que eu costumo brincar fazendo analogias ao comando rm -rf /, pois bem! Recentemente foi adicionado um patch ao pacote coreutils que por sua vez foi adotado por algumas distribuições Linux, entre elas o pessoal do Debian aderiu este patch na sua versão unstable assim como percebi também que no Ubuntu 8.10 já possui tal modificação no coreutils. Que por sua vez desabilita a possibilidade de você acidentalmente ou não execute um rm -rf /, veja exemplo abaixo.

# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 5.0 (lenny)
Release: 5.0
Codename: lenny
# rm -rf /
rm: cannot remove root directory ‘/’
#

Pois se caso você queira realmente desestressar e mostrar que você e quem manda na sua máquina, não tem problema! basta adicionar a opção –no-preserve-root e dai você terá a liberdade de expressar seus sentimentos de fúria ou autoridade sobre o seu Linux! Mesmo assim fiquei ainda curioso e fui ver no código fonte sobre a veracidade deste feito, abaixo seguem os trechos para caso você queira também dar uma olhada tanto no funcionamento do comando rm como também tal “cuidado” adicionado recentemente.

1) Baixando o fonte via apt-get

$ lsb_release -c -r
Release: 8.10
Codename: intrepid
$
$ sudo apt-get source coreutils
$ cd coreutils-6.10/
$ sudo tar -xzf coreutils-6.10.tar.gz
$ find $PWD -iname “rm.c”
/tmp/coreutils-6.10/src/rm.c
$

2) Verificando tais trechos mais interessantes.

//$ cat -n coreutils-6.10/src/rm.c | sed '227,233!d'
227    int
228    main (int argc, char **argv)
229    {
230      bool preserve_root = true;
231      struct rm_options x;
232      bool prompt_once = false;
233      int c;
// $ cat -n coreutils-6.10/src/rm.c | sed '348,355!d'
348      if (x.recursive & preserve_root)
349        {
350          static struct dev_ino dev_ino_buf;
351          x.root_dev_ino = get_root_dev_ino (&dev_ino_buf);
352          if (x.root_dev_ino == NULL)
353            error (EXIT_FAILURE, errno, _("failed to get attributes of %s"),
354            quote ("/"));
355       }
// $

3) Conforme trecho do próprio man do comando rm, a opção vem habilitada por padrão para evitar tais “imprevistos”!

$ cat -n <(man rm) | sed ’45,51!d’
45
46 –no-preserve-root
47 do not treat ‘/’ specially
48
49 –preserve-root
50 do not remove ‘/’ (default)
51
$

Então concluímos que não e bem o fim do famoso “rm -rf /”, agora e preciso adicionar o parâmetro “–no-preserve-root” para que você consiga mostrar quem e que manda! e durante pesquisas descobri que tal cuidado já havia sido adotado pela Sun no Solaris conforme este link.

OBS: Eu não me responsabilizo por nada que você venha a testar ou fazer relacionado a leitura deste POST, seja cuidadoso! :P

- Checando processos com a libproc

Creio que quase todas as pessoas que utilizam Linux tiveram a necessidade de utilizar algum dos comandos kill, killall, ps, pgrep,… entre tantos outros programas que fazem parte do pacote procps[1].

Justamente a minha necessidade foi diferente, estava precisando em algum momento verificar se um determinado executável estava em execução na lista de processos, foi desta forma que baixei o código fonte do pacote procps e fui da uma olhada para entender sua API que por sinal não existe nenhuma documentação! isto mesmo, existe apenas o pacote procps e o procps-devel que possui os headers utilizado para a acessar os métodos existentes na libproc (geralmente em /lib/libproc.so) conforme abaixo.

[jpereira@jiraya codes]$ ls -1 /usr/include/procps/
alloc.h
devname.h
escape.h
procps.h
pwcache.h
readproc.h
sig.h
slab.h
sysinfo.h
version.h
wchan.h
whattime.h
[jpereira@jiraya codes]$

Desta forma segue um simples código de exemplo utilizado para verificar se o programa especifico passado como parâmetro está em execução.

/**
 * Autor: Jorge Pereira <jpereiran@gmail.com>
 * Data:  Ter Jan 13 14:29:29 BRST 2009
 * Desc:  Simples aplicacao utilizada para verificar se existe um
 * processo em execucao utilizando a procps (libproc)
 *
 * Build: gcc -o checkps checkps.c -lproc
 **/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <stdbool.h>

#include <readproc.h>

bool check_process(const char *proc)
{
	int32_t flags = 0;
	PROCTAB *ptp  = NULL;
	bool 	 st   = false;
	proc_t task;

	memset(&task, 0, sizeof (task));

	if (!proc || strlen(proc) < 1)
		return false;

	flags = PROC_FILLCOM | PROC_FILLSTATUS;

	if ((ptp = openproc (flags)) == NULL)
		return false;

	while(!st && readproc(ptp, &task))
	{
        const char *cmd = (task.cmdline != NULL) ? task.cmdline[0] : task.cmd;

		st = !strncmp(proc, cmd, strlen(proc));
		memset (&task, 0, sizeof (task));
	}

	closeproc (ptp);

    return st;
}

int main (int argc, char *argv[])
{
    if (argc < 2)
    {
        printf ("Usage: %s <nome do processo>\n", argv[0]);
        exit(EXIT_SUCCESS);
    }

    printf("O Programa (%s) %sesta em execucao\n", argv[1], check_process(argv[1]) ? "" : "nao ");

    return EXIT_SUCCESS;
}

Baixando este código de exemplo, compilando e fazendo uma checagem se existe o processo “dbus-launch” em execução! :)

[jpereira@jiraya tmp]$ wget http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2009/01/checkps.c
[jpereira@jiraya tmp]$ gcc -o checkps checkps.c -lproc
[jpereira@jiraya tmp]$ ./checkps dbus-launch
O Programa (dbus-launch) está em execução
[jpereira@jiraya tmp]$ ./checkps dbus-lanche
O Programa (dbus-lanche) não está em execução
[jpereira@jiraya tmp]$

- Depurando bibliotecas dinamicas no Linux

Durante desenvolvimento do projeto que faço parte aqui na empresa, tive necessidade de fazer uma depuração de todas as funções chamadas externamente a partir de bibliotecas dinâmicas. Então para aqueles que não conhecem tal recurso existente na glibc, abaixo um exemplo utilizando o comando ls como alvo da depuração.

1) Devemos utilizar a variável de ambiente LD_DEBUG, primeiramente iremos utilizar passando o parâmetro help para em seguida utilizar de acordo com a necessidade!

[root@jiraya ~]# export LD_DEBUG=help
[root@jiraya ~]# ls
Valid options for the LD_DEBUG environment variable are:

libs        display library search paths
reloc       display relocation processing
files       display progress for input file
symbols     display symbol table processing
bindings    display information about symbol binding
versions    display version dependencies
all         all previous options combined
statistics  display relocation statistics
unused      determined unused DSOs
help        display this help message and exit

To direct the debugging output into a file instead of standard output
a filename can be specified using the LD_DEBUG_OUTPUT environment variable.
[root@localhost ~]# export LD_DEBUG=libs
[root@localhost ~]# ls
5957:     find library=librt.so.1 [0]; searching
5957:      search cache=/etc/ld.so.cache
5957:       trying file=/lib/i686/librt.so.1
5957:
5957:     find library=libacl.so.1 [0]; searching
5957:      search cache=/etc/ld.so.cache
5957:       trying file=/lib/libacl.so.1
5957:
5957:     find library=libc.so.6 [0]; searching
5957:      search cache=/etc/ld.so.cache
5957:       trying file=/lib/i686/libc.so.6
5957:
5957:     find library=libpthread.so.0 [0]; searching
5957:      search cache=/etc/ld.so.cache
5957:       trying file=/lib/i686/libpthread.so.0
5957:
5957:     find library=libattr.so.1 [0]; searching
5957:      search cache=/etc/ld.so.cache
5957:       trying file=/lib/libattr.so.1
5957:
5957:
5957:     calling init: /lib/i686/libpthread.so.0
5957:
5957:
5957:     calling init: /lib/i686/libc.so.6
5957:
5957:
5957:     calling init: /lib/libattr.so.1
5957:
5957:
5957:     calling init: /lib/libacl.so.1
5957:
5957:
5957:     calling init: /lib/i686/librt.so.1
5957:
5957:
5957:     initialize program: ls
5957:
5957:
5957:     transferring control: ls
5957:
5957:     find library=libnss_files.so.2 [0]; searching
5957:      search cache=/etc/ld.so.cache
5957:       trying file=/lib/libnss_files.so.2
5957:
5957:
5957:     calling init: /lib/libnss_files.so.2
5957:
bin  get  hdparm.sh  he  he.c  seeker  src  tmp
[root@localhost ~]#

2) Caso queira enviar a saída da depuração para um arquivo, basta utilizar a variável de ambiente LD_DEBUG_OUTPUT, abaixo um exemplo de uma depuração completa com o modo all seguido de toda saída sendo enviada para o arquivo ls-debug-calls.log

[root@jiraya ~]# export LD_DEBUG_OUTPUT=ls-debug-calls.log
[root@jiraya ~]# export LD_DEBUG=all
[root@jiraya ~]# ls

3) Para desativar, basta simplesmente remover a variável de ambiente LD_DEBUG e se for o caso também a LD_DEBUG_OUTPUT

[root@jiraya ~]# unset LD_DEBUG
[root@jiraya ~]# unset LD_DEBUG_OUTPUT
[root@jiraya ~]# ls

Mais informações podem ser encontradas em Program-Library-HOWTO

- C++ Portability Guide

Para aqueles que precisam desenvolver aplicações em C++ que seja o mais portável possível entre compiladores, ótimo quando durante o desenvolvimento existe a necessidade que o mesmo código ou boa parte seja portável o suficiente para rodar no Linux e no Win32.

Este sem sombra de dúvidas e um excelente documento desenvolvido e utilizado no desenvolvimento do Mozilla, vale a pena conferir!

- bug x feature

Quem nunca tiver implementado um “bug elegante” que atire a primeira pedra… :)

- Zcon 2008 – Desenvolvendo aplicações no Linux

Recife sediou entres os dias 22/23 o evento “Zcon“, sendo este organizado pela empresa de cursos “Especializa Cursos”, o evento de primeira linha contou com a infra-estrutura da faculdade “Maurício de Nassau” e mesmo sendo durante o final de semana, teve uma grande demanda de pessoas interessadas nos mini-cursos e palestras apresentadas durante o evento.

Estive a convite de um grande amigo Berardo, atual dono da Especializa Cursos que foi uma das pessoas envolvidas na organização do evento, apresentei a palestra “Desenvolvendo aplicações no Linux” em seguida vários temas foram abordados. Inclusive sobre Pygames, apresentado por Larry Jr entre tantos outros temas bem legais!

Segundo o próprio Berardo, mais eventos virão em breve! quem sabe algo sobre o GNOME? Quem virá a Recife? :P

Slide: Desenvolvendo aplicações no Linux

- Brincando com o MAMONA

Desde que estive no “BossaConference”[1] e assisti a palestra sobre o “UbuntuMobile”[2] que só fez aumentar mais ainda a curiosidade sobre o funcionamento de tais sistemas! na época li vários textos durante pesquisas sobre o assunto até que cheguei no projeto “Mamona” que abaixo segue uma breve descrição.

“O Mamona e uma plataforma Linux para sistemas embarcados ARM EABI (Que utilizem processadores ARM compostos de uma interface binária de aplicações para sistemas embarcados), que tem como seu principal objetivo oferecer uma alternativa completamente OpenSource tendo 100% de seu core composto de ferramentas de código aberto. Alem de ser baseado no debian, desenvolvido e mantido pelo INDT. Tem como principal idéia que seja utilizado em toda plataforma onde você tenha liberdade de instalar e testar os componentes. Se você achar algum celular não fechado (NEO é um exemplo), você pode colocar o mamona lá sem problemas!”

Resumindo, comecei a brincar e estudar um pouco sobre o plataforma por pura vontade e resolvi escrever um howto em português explicando e tentando ser um pouco mais detalhado do que os materiais que encontrei no wiki do projeto! Creio que irá ser útil para aqueles que não conhecem ou simplesmente tem interesse em conhecer sobre plataformas do gênero! ou até mesmo sendo um projeto bem interessante para aqueles que tem interesse em colaborar com a comunidade opensource!

[1] Impressões pessoais sobre o evento BossaConference
[2] UbuntuMobile

Comentários e criticas são bem vindos! ;)

- utilizando mmap() para mapear arquivos na memoria

… Conforme definição do Wikipédia sobre a chamada mmap(), vemos abaixo!

Em computação, mmap é uma chamada de sistema do Unix, em conformidade com o POSIX, que mapeia arquivos ou dispositivos na memória. É um método de E/S de arquivo mapeado em memória. Ela implementa naturalmente a paginação por demanda, pois os conteúdos iniciais dos arquivos não são inteiramente lidos do disco e não usam a memória RAM física completamente. A real leitura do disco é feita de maneira “preguiçosa”, após uma posição específica ter sido acessada.

Ou seja, podemos fazer muitas coisas utilizando a chamada mmap(), principalmente quando e preciso manipular arquivos de grande portes, e você não quer ter buffers auxiliares entre tantas outras possibilidades, que na grande maioria seguimos o seguinte fluxo.

open() -> read() || write() -> close()

Abaixo segue o  código cp-no-mmap.c detalhando melhor meu comentário!

/**
 * Autor: Jorge Pereira
 * Data: Thu Oct  9 22:47:47 BRT 2008
 * Desc: Exemplo de um codigo para copia de arquivos.
 * Arquivo: cp-no-mmap.c
 */
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <err.h>

#define IO_SIZE 4096

int
main(int argc, char *argv[])
{
int32_t fdr, fdw;
ssize_t reads;

/* Como de costume, temos um buffer temporario para auxiliar a copia */
char buf[IO_SIZE];

if(argc < 3)
{
  printf("Usage: %s  \n", argv[0]);
  exit(EXIT_FAILURE);
}

/* Arquivo de origem */
fdr = open(argv[1], O_RDONLY);
if(fdr < 0)
{
  err(1, "Falha ao abrir (%s)", argv[1]);
  exit(EXIT_FAILURE);
}

/* Arquivo de destino */
fdw = open(argv[2], O_CREAT | O_RDWR, 0644);
if(fdw < 0)
{
  err(1, "Falha ao abrir (%s)", argv[2]);
  exit(EXIT_FAILURE);
}

/* Inicio da copia */
while ((reads = read(fdr, buf, sizeof(buf))) > 0)
{
  if(write(fdw, buf, reads) < reads)
  {
    err(1, "Problemas com write()");
    break;
  }
}

/* fechando os descritores */
close(fdr);
close(fdw);

return EXIT_SUCCESS;
}

O Arquivo de exemplo se chama “Prison.Break.S04E07.HDTV.XviD-0TV.avi”, abaixo segue o tamanho dele para termos idéia em relação ao tempo de cópia!

[jpereira@jiraya blog]$ ls -lh Prison.Break.S04E07.HDTV.XviD-0TV.avi
-rw-r–r– 1 jpereiran jpereiran 351M 2008-10-09 22:06 Prison.Break.S04E07.HDTV.XviD-0TV.avi
[jpereira@jiraya blog]$ gcc -o cp-no-mmap cp-no-mmap.c
[jpereira@jiraya blog]$ time ./cp-no-mmap Prison.Break.S04E07.HDTV.XviD-0TV.avi Prison.Break.S04E07.HDTV.XviD-0TV.avi.copia
real 0m3.115s
user 0m0.008s
sys 0m2.496s
[jpereiran@jiraya blog]$

Agora veremos exemplo do mesmo código chamado cp-mmap.c utilizando uma chamada mmap(), fazendo com que todos os bytes lidos pela chamada read() sejam salvos em uma região de memória previamente mapeada para que possamos efetuar operações de leitura, e escrita caso seja necessário! repare que não esta sendo utilizado um buffer auxiliar para salvar os dados do read(), como e feito de costume! :)

/**
 * Autor: Jorge Pereira
 * Data: Thu Oct  9 22:47:47 BRT 2008
 * Desc: Exemplo de um codigo para copia de arquivos utilizando mmap()
 * Arquivo: cp-mmap.c
 */
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <err.h>

#define IO_SIZE 4096

int
main(int argc, char *argv[])
{
int32_t fdr, fdw, fdm;
ssize_t reads;
/* repare que ao inves de utilizarmos um buffer auxilia, iremos ter um ponteiro apenas */
void *mem;

if(argc < 3)
{
  printf("Usage: %s  \n", argv[0]);
  exit(EXIT_FAILURE);
}

/* Arquivo de origem */
fdr = open(argv[1], O_RDONLY);
if(fdr < 0)
{
  err(1, "Falha ao abrir (%s)", argv[1]);
  exit(EXIT_FAILURE);
}

/* Arquivo de destino */
fdw = open(argv[2], O_CREAT | O_RDWR, 0644);
if(fdw < 0)
{
  err(1, "Falha ao abrir (%s)", argv[2]);
  exit(EXIT_FAILURE);
}

/* tal device abaixo ira prover caracteres nulos '\0', estaremos apenas fazendo
* o mapeamento do dispositivo para uma regiao de memoria com tamanho definido
* neste caso por "IO_SIZE", com protecao R+W e sendo visivel apenas para o
* processo corrente, sem offsets referente a paginas de memoria.
*
* 1) Abrindo o device /dev/zero
* 2) Fazendo o mapeamento na linha 67
*
* OBS: Na duvida consulte a man do mmap(), e veja um exemplo utilizando mais
* detalhes conforme sua necessidade!
*/
if((fdm = open("/dev/zero", O_RDWR)) < 0)
{
  err(1, "Falha ao abrir (%s)", argv[2]);
  exit(EXIT_FAILURE);
}
mem = mmap(NULL, IO_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE, fdm, 0);
close(fdm);

/**
* Inicio da copia, repare que estamos lendo do disco e "copiando" para regiao
* de  memoria mapeada, e escrevendo apartir do mesmo mapeamento! funcionando
* como uma variavel temporaria.
*/
while ((reads = read(fdr, mem, IO_SIZE)) > 0)
{
  if(write(fdw, mem, reads) < reads)
  {
    err(1, "Problemas com write()");
    break;
 }
}

munmap(mem, IO_SIZE);

/* fechando os descritores */
close(fdr);
close(fdw);

return EXIT_SUCCESS;
}

Abaixo vamos compilar e fazer o mesmo teste, copiando o mesmo arquivo!
[jpereira@jiraya blog]$ gcc -o cp-mmap cp-mmap.c
[jpereira@jiraya blog]$ time ./cp-mmap Prison.Break.S04E07.HDTV.XviD-0TV.avi Prison.Break.S04E07.HDTV.XviD-0TV.avi.copia
real 0m2.777s
user 0m0.020s
sys 0m2.056s
[jpereiran@jiraya blog]$

Conclusão

Repare que o ganho e imperceptível quando executamos tais rotinas em computadores x86 compostos de processadores de alta capacidade, sem falar dos discos rígidos de alta rotação! certo?
Porém quando você está trabalhando em um ambiente embarcado limitado de recursos, que quaisquer ganho de performance e velocidade e bem vindo! este foi meu caso em que precisava-se efetuar operações de I/O em um SD-CARD com um processador ARM um tanto quanto “humilde”, e tais dados além de ser copiados eram necessário gerar chaves MD5 entre outros detalhes com tal stream de dado, lembro que o ganho ficou por volta de 20% e 30% com o mapeamento utilizando mmap(). Dúvidas e comentários serão bem vindos

Referências

  • man 2 open
  • man 2 mmap
  • http://www.gnu.org/software/libtool/manual/libc/Memory_002dmapped-I_002fO.html

Autor

Jorge Pereira