Conservadorismo do padrão POSIX

O padrão POSIX foi criado na decada de 80 para permitir a portabilidade entre plataformas UNIX, anos mais tarde o Linux também aderiu ao padrão, assim como uma port chamada CYGWIN também habilitou os sistemas Windows a rodarem estas aplicações.

Além de uma interface de usuário (o shell, Korn Shell no caso), se é que ainda podemos chamar assim. Também foi criada uma interface de acesso aos serviços do Sistema Operacional, chamadas de SYSCALLS.

A verdade é que fazem quase 25 anos que estes padrões estão inalterados, e nos dias de hoje é simplesmente impossível entender por que ainda seguimos esta norma, abaixo segue um exemplo de como esta desatualizada a API de programação:

struct ifreq *ifr;
struct ifreq ifrr;
struct sockaddr_in sa;

ifr = &ifrr;

ifrr.ifr_addr.sa_family = AF_INET;

strncpy(ifrr.ifr_name, ifname, sizeof(ifrr.ifr_name));

…..

*ifaddr = ifrr.ifr_addr;
printf(”Address for %s: %s\n”, ifname, inet_ntoa(inaddrr(ifr_addr.sa_data)));

O código acima serve para mostrar os IP’s das interfaces de rede presentes na maquina, ele é tão antigo que no tempo em que o POSIX foi criado, as máquinas dificilmente tinham varias interfaces de rede, então para facilitar ao programador localizar o IP da máquina, foi criada uma macro chamada ifr_addr.sa_data, mas o que acontece quando queremos saber o endereço de outras interfaces? A maneira mais simples é fazer isto:

Copiar o nome da interface para a estrutura ifrr, chamar novamente o ioctl() pertinente, e pegar o campo .sa_data, mas o que acontece se não sabemos o nome da interface? Bem.. dai perdeu playboy. Não existe syscall POSIX para enumerar as interfaces presentes.. O Linux atualmente esta implementando uma função mas não é padrão..

Um método extremamente ultrapassado de se fazer uma operação muito simples.

E assim acontece o mesmo com a maioria das chamadas SYSCALLS do POSIX, outro exemplo é o já citado ioctl(), ele tem tantas funções que simplesmente é impossível uma pessoa saber a metade deles, ele preenche estruturas de tamanho variavel, com informação variavel, sem qualquer explicação do retorno possível a não ser na documentação do proprio sistema operacional.

Tenho conhecimento de dois sistemas operacionais com API’s atuais, o Windows e o Mac OS X.

No caso do Windows existem tantas SYSCALLS que algumas inclusive fazem exatamente as mesmas coisas, somente para manter a compatibilidade entre as versões interiores, mas a questão é que pelo menos elas lidam com problemas atuais como Orientação a Objeto, Leitura e Escrita multiplexada (ao mesmo tempo sem threads) e muito mais.

Ainda existe o Darwin, que é o verdadeiro sistema operacional do Mac OS X, pois este é muito mais, na verdade é um conjunto de serviços de alto nivel como manipulação de tela, execução de conteudo multimidia, comunicação com hardware e dezenas de outros serviços.

O fato é que este último eu ainda estou estudando para poder dar uma opnião correta, mas o meu ponto neste artigo é que, pelo menos estes dois sistemas operacionais tentam atender as necessidades dos desenvolvedores, ao contrario do POSIX que tenta manter compatibilidade e dificulta a criação de aplicações.

Acredito que num futuro breve será necessária a criação de um novo padrão para compatibilidade de sistemas operacionais, e poderemos nos ver livres desta interface velha e obsoleta.

Windows coding x idling

Aqui estou eu, em uma cidadezinha no norte da espanha chamada Bilbao, num sabado a noite sem NADA pra fazer, ontem uma das pessoas responsaveis pela minha estadia aqui nos levou para um restaurante, alias o único que eu vi desde que cheguei aqui, que consegue dar juz ao nome.

Bem, o que acontece é que tomei todas e acordei com uma ressaca sem noção, acabei levantando as 4 da tarde sem poder almoçar descentemente, perdi o horário da janta e ainda por cima a atendente do hotel me diz que não existe nenhum tipo de delivery nesta cidade. Logo estou preso ao meu computador até dar sono, com uma fome desgraçada.

Nesta hora de desespero tudo vale a pena para dar sono, então resolvi terminar um projetinho que estou desenvolvendo pra Win32, eu utilizado Mac e rodo a instancia de windows pelo parallels, o que torna programar uma tarefa bem mais consistente pois se o seu windows trava, da pra restartar sem perder coisas importantes que voce sempre esta rodando.

Este código que estou mechendo contém um leak de memória que eu não consigo encontrar onde diabos está, e apesar desse Visual Studio 8 prometer ser a solução para todos os problemas, ele ainda não chega perto do bom e velho valgrind. Uma ferramentinha interessante para Unix, que mapeia todos as alocações de memória as rotinas de liberação das mesmas, assim consegues em minutos encontrar todo leak que tenhas.

O jeito é assistir ao festival Tarantino que está passando na tv e ver se a teoria do Selton Melo está certa.