Arquivo da tag: programming

Escrevendo Arquivo usando Syscall

Boa Tarde Meus Caros. hoje vou ensinar como  escrever um arquivo simples usando open e write
que são syscalls do sistema linux

syscalls são chamadas de baixo nivel  diretamente pelo kernel geralmente são representadas como números no assembly

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>


int main(int argc, char *argv[]){


int fd = open("meuarquivo.txt", O_RDWR | O_CREAT, S_IRWXU );
write(fd, "teste", 6 );
close(fd);


return 0;
}

#include <stdio.h> /* Biblioteca padrão. */
#include <unistd.h> /* para funções como read, write open  */
#include <fcntl.h> /* para O_RDWR, O_CREAT, S_IRWXU */
#include <sys/stat.h> /* struct  stat */

Estas bibliotecas são essenciais para poder usar as funções demonstrada nesse post
lembrando que nao pode funcionar em outros sistemas operacionais como windows

int fd = open("meuarquivo.txt", O_RDWR | O_CREAT, S_IRWXU ); /* fala pro kernel criar um arquivo com a função leitura / escrita e permissão total */
write(fd, "teste", 6 );  /* escreve o texto, lembrando que o ultimo parametro é o tamanho do buffer a ser escrito */ 
close(fd);

fd é o file descriptor, é um numero unico que o kernel identifica o arquivo aberto para leitura ou escrita

write é a função para escrever o dado do buffer no arquivo, o ultimo parametro é o tamanho do buffer a ser escrito. se o tamanho do buffer for maior que o proprio buffer o tamanho extra será preenchido com Zero

fiz um exemplo de uso syscall como é chamado via assembly
me perdoe nao sou nenhum expert no assembly se tiver algo errado me envie uma mensagem

Revisão do codigo:

section .data
  texto       db "teste",10
  texto_len  equ $ - texto

  arq      db "meuarquivo.txt",0
  arq_len  equ $ - arq

  sys_open 	equ 5 ; syscall numero 5
  sys_write	equ 4 ; syscall numero 4
  sys_close     equ 6 ; syscall numero 6




section .text

global _start

_start:
		; estes comandos abaixo e equivalente a
		; int fd = open("meuarquivo.txt", O_RDWR, S_IWRXU);
		; em C

		mov eax, 5 ; syscall da funcao open
		mov ebx, arq ; 2 parametro nome do arquivo
		mov ecx, 100 ; valor do tipo de abertura
		mov edx, 0o777 ; permissao  do usuario
		int 80h 
		xchg eax, esi ; realiza um swap  passando eax pra esi
		
		
		; estes comandos abaixo e equivalente a
		; write(fd, "teste", 5)
		; em C
	
		mov edx, 5 ; tamanho do buffer a ser gravado
		mov ecx, texto ; teexto a ser gravado
		mov ebx, esi ;  file descriptor  do arquivo
		mov eax, 4	;syscall de write()

	
			; estes comandos abaixo e equivalente a
		; close(fd)
		; em C
		mov eax, 6 ; syscall de close()
		;ebx ja esta definido com o file descriptor
		int 80h	
		
		; equivalente a exit(0);
		mov eax, 1 ; syscall  de exit()
		mov ebx, 0 ;  passa  1 parametro 0
		int 80h	



		


             

digamos que voce queira saber qual o file descriptor de um tipo de dado FILE*

basta usar fileno();

  FILE* fp = fopen("meuarquivo.txt","wb");
  int fd = fileno(fp)

agora voce pode usar funcões de write e read diretamente do FILE

Criando Callbacks em C

Callbacks são ponteiros de funções que necessita ser associado a um endereço de memoria  de uma outra função  para ser chamado
quase equivalente a um método abstrato de uma classe

Casos De Uso:

  •   Uma estrutura de chamada de comandos
  • Sistema de plugins onde as chamadas do plugin são alocados em um callback

 

#include <stdio.h>

typedef int (*calc)(int a, int b);

int soma(int a, int b){
  return (a+b);
}

int mul(int a, int b){
  return (a*b);
}

int sub (int a, int b){
  return (a-b);
}

int main(int argc, char * argv[]){

   calc c;

   c = &soma;
   printf("SOMA: %d+%d=%d\n",2,2, c(2,2));

   c = &sub;
    printf("SUBTRACAO: %d-%d=%d\n",2,2, c(2,2));

   c = &mul;
   printf("MULTIPLICACAO: %d*%d=%d\n",2,2, c(2,2));

return 0;
}

Alterando valor de uma variavel através de ponteiros

Olá meus Caros hoje vou ensinar uma c das coisas que muita gente sofre. assim como eu sofri muito por ser autodidata em C e tenho muito que aprender vou ensinar a alterar o conteudo na memoria atraves de ponteiros.

 


#include <stdio.h>

int main(int argc, char* argv[]){

 int a = 999;
 int *ptr_a = &a;
 int **d = &ptr_a;

 printf("a=%d\n", a);
 printf("*ptr_a=%d\n", *ptr_a);
 printf("**d=%d\n", **d);

**d = 133;

printf("apos mudanca\n\n");
printf("a=%d\n", a);
printf("*ptr_a=%d\n", *ptr_a);
printf("**d=%d\n", **d);

return 0;
}

O Resultado Deste Código

a=999
*ptr_a=999
**d=999
apos mudanca

a=133
*ptr_a=133
**d=133

 

 

como pode ver  alterei apenas o ponteiro  de ponteiro

e ele alterou o valor que ja se encontra na memoria que é o int a

 

não sou nenhum conhecer profundo de C mas acredito que este exemplo seja bem simples

caso tiver sugestões escreve um comentario. se tiver algo para corrigir  tambem. foque a vontade. e até mais