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