3. Agenda
● Por que o C nunca vai sumir?
● A suíte de compiladores GNU
● Criando um projeto de exemplo
● Distribuindo o software
● Mercado
3
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.
4
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...
5
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("%dn", i);
return 0;
}
$ chmod +x ate3.c
$ ./ate3.c
---
$ cat << EOF | tcc -run -
>main(void) { puts("Diz aê pro tcc!"); }
>EOF
6
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!
7
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.
● #comofas
O 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 ioctl
int ioctl(int d, int request, ...);
8
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/sdc
dd: writing to `/dev/sdc': Operation not permitted
9
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.
10
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
● Testes
Várias máquinas, diferentes arquiteturas.
Diferentes dispositivos de blocos (para este caso).
11
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.
12
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. ;-)
13
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
14