Download - Programando Software Livre em C
1
2
Programando Software Livre em C
Fernando Mercês
3
Agenda
● Por que o C nunca vai sumir?
● A suíte de compiladores GNU
● Criando um projeto de exemplo
● Distribuindo o software
● Mercado
4
Por que o C nunca vai sumir?
● Metade do universo é escrito em C (kernel Linux, Windows, httpd, samba, squid, bind, java, python, php, openldap, wine...)
● Desempenho: o compilador C gera código de máquina.
● Portabilidade: SIM, basta que seu código não dependa de bibliotecas não portáveis! E ainda existe Cygwin!
● Quem falou que C é velho? A última atualização da especificação foi em 2011.
● O comitê WG14 da ISO/IEC especificou na C11 recursos como multithreading (thread.h), bound checking em funções como strcpy() e estruturas anônimas.
5
A suíte de compiladores GNU
● GNU Compiler Collection, compila C, C++, Objective-C, Fortran, Java, Ada e Go.
● A versão 4.7.1 saiu em 14 de junho deste ano.
● Conta com poderosos aliados como gdb e make.
● Extensa documentação, cheia de recursos, otimizações para processadores específicos, proteções de código etc.
● Mas existem outros livres como CLang, tcc...
6
Brinque com o tcc!
$ cat ate3.c#!/usr/bin/tcc -run
#include <stdio.h>
int main(void){ for (int i=0; i<3; i++) printf("%d\n", i);
return 0;}
$ chmod +x ate3.c$ ./ate3.c
---$ cat << EOF | tcc -run ->main(void) { puts("Diz aê pro tcc!"); }>EOF
7
A suíte de compiladores GNU
● GNU Compiler Collection, compila C, C++, Objective-C, Fortran, Java, Ada e Go.
● A versão 4.7.1 saiu em 14 de junho deste ano.
● Conta com um poderoso aliado: o GNU Debugger (gdb).
● Extensa documentação, cheia de recursos, otimizações para processadores específicos, proteções de código etc.
● Experimente também o tcc!
8
Criando um projeto de exemplo
● O que eu quero?Setar um dispositivo de bloco (/dev/sdX) como somente leitura ou não, para evitar escrita acidental como echo 'lalalaal' > /dev/sdX.
● #comofasO Linux possui a syscall (e uma wrapper na glibc) ioctl, que aceita os comandos BLKROSET e BLKROGET.
● Consultar manual da função ioctl()$ man 2 ioctlint ioctl(int d, int request, ...);
9
Prova de conceito
#includes...
int fd = open(“/dev/sdc”, O_RDONLY);int ro = 1;
ioctl(fd, BLKROSET, &ro);
---
# dd if=<(echo 'doingshit') of=/dev/sdcdd: writing to `/dev/sdc': Operation not permitted
10
Antes de virar um projeto...
● E se der erro?Tratamento de erro (if).
● O usuário sabe o que o software faz?help(), usage(), documentação, manpages.
● Quais as dependências?ldd.
● Preciso licenciar o código?● Cabeçalho GPL ou de outra licença livre.
11
Antes de virar um projeto (cont.)...
● E o Makefile?
all: gcc -W -Wall -Wextra -o devprot devprot.c
clean: rm -f devprot
● Compilando o devprot.c
$ make
● TestesVárias máquinas, diferentes arquiteturas.Diferentes dispositivos de blocos (para este caso).
12
Distribuindo o software
● Tenho fegonha! Ah, focê chula?!
● Controle de versão para *código*.
● Source Forge para todo o resto, como binários pré-compilados.
● No Github é muito fácil enviar e receber patches.
13
Mercado para C
● Kernel, aplicações 'core', alto desempenho, real time, embarcados.
● Google, Opera, Mandriva, Red Hat, várias de embarcados, de telecom, de segurança...
● Em alta, por tempo inderteminado!
● C++ também!
● Lucro (in)direto: colaborando com SL.
● Outras linguagens “nativas” como D e Go vão demorar um pouco para “colar”. Enquanto isso, divirta-C. ;-)
14
Referências
● Especificações da linguagem C http://www.mentebinaria.com.br/artigos/0x1c/0x1c-cspecs.html
● WG14 http://www.open-std.org/jtc1/sc22/wg14/
● Mudanças no gcc 4.7 http://gcc.gnu.org/gcc-4.7/changes.html
● BLKROGET e BLKROSET definidos em /usr/src/linux/fs.h
● devprot.c completo http://www.mentebinaria.com.br/files/devprot.c
● Escolha um pra colaborar: https://github.com/merces