Archive for the ‘C’ Category.

Desenvolvimento de plugin para o eclipse

Uso o Eclipse para duas coisas: Desenvolver aplicações em C e usar com indexador para o código do kernel (também uso o cscope, mas para partes do sistema que nunca toquei, navegar com o eclipse é mais confortável).

Mas agora me surgiu uma nova necessidade, estou estendendo os plugins do LTTng para o meu tema do mestrado, então tenho que usar o eclipse para editar o próprio eclipse, e é muito bom, é muito fácil extender o eclipse.

Agora entendi porque os fabricantes de hardware como a Texas, Atmel, and so on, usam o eclipse como interface, é realmente simples. Com certeza, junto com o kernel e a gcc o eclipse é um dos meus projetos de software livre predileto, e ó que ele é escrito em Java!.

Segui o seguinte how to para montar o ambiente de desenvolvimento: http://wiki.eclipse.org/Linux_Tools_Project/LTTng_Eclipse_Plug-in_Development_Environment_Setup

Branch prediction on userspace

To use GNU C likely and unlikely in userspace, use it:

#ifdef __GNUC__
#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)
#else
#define likely(x)       (x)
#define unlikely(x)     (x)
#endif

Creating a daemon in C

#include 
#include 
#include 

/* based on code lighttpd:server.c source file */

void daemonize(void) {
        signal(SIGTTOU, SIG_IGN);
        signal(SIGTTIN, SIG_IGN);
        signal(SIGTSTP, SIG_IGN);
        if (0 != fork()) exit(0);

        if (-1 == setsid()) exit(0);

        signal(SIGHUP, SIG_IGN);

        if (0 != fork()) exit(0);

        if (0 != chdir("/")) exit(0);
}

int main(){

	int i;
        printf("Perhaps you want do something before go to background\n");
	scanf("%d", &i);

	daemonize();

	for (;;){
		sleep(10);
	}

}

Jprobe

  1. #include <linux/module.h>
  2. #include <linux/kprobes.h>
  3. #include <linux/fs.h>
  4.  
  5. static void jprobe_do_sys_open(int dfd, const char __user
  6. *filename, int flags, int mode)
  7. {
  8.         printk(KERN_INFO "filename: %s %d\n", filename, mode);
  9.         jprobe_return();
  10. }
  11.  
  12. static struct jprobe my_jprobe = {
  13.         .kp.symbol_name = "do_sys_open",
  14.         .entry = (kprobe_opcode_t *) jprobe_do_sys_open,
  15. };
  16.  
  17. int init_module(void)
  18. {
  19.         register_jprobe(&my_jprobe);
  20.         return 0;
  21. }
  22.  
  23. void cleanup_module(void)
  24. {
  25.   unregister_jprobe(&my_jprobe);
  26. }
  27.  
  28. MODULE_LICENSE("GPL");

Analista de desenvolvimento: Linux C e redes

A tempos que venho me interessando pelo desenvolvimento de sistemas, principalmente embarcados, e isto me fez, no final do ano passado buscar um tema de TCC que pudesse ser um DEMO de como é esta área… dei sorte; consegui junto a equipe de pesquisa e desenvolvimento de software da empresa qual trabalho o tema: QoS em rede para central VoIP em Linux embarcado, pronto, era o que eu queria, Linux embarcado, C e redes, estou em casa.

No decorrer do primeiro semestre deste ano, grande parte do meu tempo livre, incluso finais de semana, foram dedicados a isto, e não é que peguei gosto pela coisa?

Ao mesmo tempo, via os grandes desafios da administração de sistemas ficarem cada vez menores… Com o tempo, tudo aquilo que era complexo e novo, tornou-se rotina… e o brilho foi diminuindo…

Certo dia, vi um discurso do Steve Jobs, onde ele falou algo como, “se hoje fosse seu ultimo dia, você gostaria de fazer o que está prestes a fazer hoje?”, e então, a cada manhã ao me perguntar, repetidamente, a resposta era: isto não me faz mais feliz… Queria algo novo. queria algo com desenvolvimento de Linux embarcado, C e redes…

Então decidi correr atrás, e felizmente, consegui uma transferência, após alguns namoros, na mesma empresa que trabalhava, para o desenvolvimento de centrais telefónicas, trabalhando com Linux embarcado, redes e C…

Esta foi a primeira semana na nova profissão, e todos os dias dessa semana, ao acordar, a resposta foi, sim, é aqui onde estavam meus ídolos, (Ken Thompson, Denis Ritchie), é aqui que quero estar… Linux embarcado, C e redes…

(get|set)sockopt

Menu de seleção de opções para fazer em uma sexta que você está de folga:
  1. 1: Ir a praia
  2. 2: Fazer uma trilha de bicicleta
  3. 3: Ver TV
  4. 4: Ler: "Programação para redes Unix"
  5. Digite sua Opção:
  6. 4
  7. Opção 4: você é um nerd.
  8.  
  9. – Eu   n ã o   s o u    N E R D…

Os sockets possuem algumas opções e ajustes que podem ser feitos, como por exemplo, o tamanho do buffer de envio e recebimento de pacotes, se o pacote pode ser enviado para broadcast (este somente para sockets de datagrama (ex: UDP)), o TTL do pacote, etc.

Um dos meios de ajustar estes valores é utilizando as chamadas do sistema getsockopt(2) e setsockopt(2)

int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen);
  1. int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);

Os argumentos, são:

int s: Descritor do soquete aberto
int level: Nivel do protocolo que deseja alterar a opção (ip, tcp, udp…)
int optname: Opção que deseja alterar
void *optval: Um ponteiro para a variável ao qual o valor deve ser gravado em getsockopt() ou lido em setsockopt().
socklen_t optlen: Tamanho da variável optval

Os valores para level, optname e optval estão descritos nas sessões “Socket Options” de ip(7),tcp(7),udp(7),socket(7) e unix(7).

O código abaixo, trás dois exemplos de opções:

  • Aumentar o tamanho do buffer de recebimento
  • Liberar o envio de pacotes UDP para o endereço de broadcast da rede:

sockopt.c Continue reading ‘(get|set)sockopt’ »