Posts tagged ‘C’

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’ »