Chamadas de sistema

Tutorial do Stat System Call Linux

Tutorial do Stat System Call Linux

Chamadas de sistema Linux

As chamadas de sistema fornecidas pelo kernel do linux são expostas na linguagem de programação C via glibc.  Quando uma chamada do sistema é usada, você está se comunicando com o sistema operacional e, ao retornar, o sistema operacional se comunica com você por meio dos parâmetros que são retornados às funções de chamada do sistema (valores de retorno).

Chamada de sistema de estatísticas:

A chamada de sistema stat é uma chamada de sistema no Linux para verificar o status de um arquivo, como para verificar quando o arquivo foi acessado. A chamada do sistema stat () realmente retorna os atributos do arquivo. Os atributos de arquivo de um inode são basicamente retornados pela função Stat (). Um inode contém os metadados do arquivo. Um inode contém: o tipo do arquivo, o tamanho do arquivo, quando o arquivo foi acessado (modificado, excluído) que são carimbos de data / hora, e o caminho do arquivo, o ID do usuário e o ID do grupo, links do arquivo e endereço físico do conteúdo do arquivo.

Podemos dizer que o inode contém todos os dados que são necessários para a chamada do sistema stat () e é o número do índice para o arquivo que é salvo na tabela do inode. Sempre que você cria um arquivo, um número de inode para esse arquivo é criado. Usando a chamada do sistema stat, as tabelas do sistema podem ser visualizadas.

Sintaxe da chamada do sistema C Stat:

Para usar a chamada de sistema stat na linguagem de programação C, você deve incluir o seguinte arquivo de cabeçalho:

#incluir

Stat é usado para obter o status de um arquivo. A sintaxe da chamada do sistema C stat pode não ser a mesma para todos os sistemas operacionais. No Linux, a sintaxe para chamada de sistema stat é a seguinte:

int stat (const char * path, struct stat * buf)

O tipo de retorno da função em int, se a função for executada com sucesso, 0 é retornado se houver algum erro, -1 será retornado.

Aqui const char * path especifica o nome do arquivo. Se o caminho do arquivo for um link simbólico, você precisa especificar o link em vez do nome do arquivo.

Então, na função, temos um estrutura estatística em que os dados ou informações sobre o arquivo são armazenados, que usa um ponteiro chamado buf, que é passado como um parâmetro e preenchido durante a execução da chamada e legível pelo usuário após a chamada.

Estrutura estatística:

A estrutura estatística que é definida em o arquivo de cabeçalho contém os seguintes campos:

struct stat

mode_t st_mode;
ino_t st_ino;
dev_t st_dev;
dev_t st_rdev;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
off_t st_size;
struct timspec st_atim;
struct timspec st_mtim;
struct timspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
;

Descrição:

  1. st_dev: É o ID do dispositivo em que nosso arquivo reside atualmente.
  2. st_rdev: Este campo descreve que um arquivo específico representa um dispositivo específico.
  3. st_ino: É o número do inode ou o número de série do arquivo. Como é um número de índice, deve ser único para todos os arquivos
  4. st_size: st_size é o tamanho do arquivo em bytes.
  5. st_atime: É a última vez ou a hora recente em que o arquivo foi acessado.
  6. st_ctime: É a hora recente em que o status ou as permissões do arquivo foram alterados.
  7. st_mtime: É a hora recente em que o arquivo foi modificado.
  8. st_blksize: Este campo fornece o tamanho de bloco preferido para o sistema de arquivos I / O, que pode variar de arquivo para arquivo.
  9. st_blocks: Este campo informa o número total de blocos em múltiplos de 512 bytes.
  10. st_nlink: Este campo informa o número total de links físicos.
  11. st_uid: Este campo indica o ID do usuário.
  12. st_gid: Este campo indica o ID do grupo.
  13. st_mode: Indica as permissões no arquivo, informa os modos em um arquivo. A seguir estão os sinalizadores que devem ser definidos para o campo st_mode:
Bandeiras Descrição Valor da bandeira
S_IFMT Uma máscara de bits usada para obter o valor do modo de um arquivo 0170000
S_IFSOCK Uma constante de arquivo de soquete 0140000
S_IFLINK Uma constante de arquivo de link simbólico 0120000
S_IFREG Constante de arquivo para arquivo regular 0100000
S_IFBLK Constante de arquivo para arquivo de bloco 0060000
S_IFDIR Constante de arquivo para arquivo de diretório 0040000
S_IFCHR Constante de arquivo para arquivo de personagem 0020000
S_IFIFO Uma constante de arquivo de fifo 0010000
S_ISUID Definir bit de ID do usuário 0004000
S_ISGID Definir bit de ID de grupo 0002000
S_ISVTX Bit aderente que indica texto compartilhado 0001000
S_IRWXU Permissões do proprietário (leitura, gravação, execução) 00700
S_IRUSR Permissões de leitura para o proprietário 00400
S_IWUSR Permissões de gravação para o proprietário 00200
S_IXUSR Permissões de execução para o proprietário 00100
S_IRWXG Permissões de grupo (leitura, gravação, execução) 00070
S_IRGRP Permissões de leitura para o grupo 00040
S_IWGRP Permissões de gravação para o grupo 00020
S_IXGRP Permissões de execução para o grupo 00010
S_IRWXO Permissões para outros (ler, escrever, executar) 00007
S_IROTH Permissões de leitura para outros 00004
S_IWOTH Permissões de gravação para outras pessoas 00002
S_IXOTH Permissões de execução para outros 00001

Como usar a chamada do sistema Stat:

O exemplo a seguir mostra como usar a chamada do sistema stat na linguagem de programação C no Linux, Ubuntu.

EXEMPLO 1:

No código a seguir, vamos encontrar o modo de um arquivo:

CÓDIGO:

#incluir
#incluir
int main ()

// ponteiro para stat struct
struct stat sfile;
// chamada do sistema stat
stat ("stat.c ", & sfile);
// acessando st_mode (membro de dados da estrutura estatística)
printf ("st_mode =% o", sfile.st_mode);
return 0;

Compilar e executar o programa retorna conforme abaixo:

Neste código, passamos o nome do arquivo na chamada do sistema stat e, em seguida, o ponteiro para a estrutura stat que é sfile. O ponteiro para stat struct é então usado para acessar st_mode que mostra o modo do arquivo usando a instrução printf.

O arquivo de cabeçalho é usado para que você possa usar a chamada de sistema de estatísticas. O arquivo de cabeçalho é o arquivo de biblioteca de entrada / saída padrão para que você possa usar printf ou scanf em seu código C.

EXEMPLO 2:

No código a seguir, obteremos informações sobre o arquivo usando uma chamada de sistema stat:

CÓDIGO:

#incluir
#incluir
#incluir
#incluir
void sfile (char const filename []);
int main ()
ssize_t read;
char * buffer = 0;
size_t buf_size = 0;
printf ("Digite o nome de um arquivo para verificar: \ n");
read = getline (& buffer, & buf_size, stdin);
se (ler <=0 )
printf ("getline falhou \ n");
saída (1);

if (buffer [ler-1] == '\ n')
buffer [leitura-1] = 0;

int s = aberto (buffer, O_RDONLY);
if (s == - 1)
printf ("Arquivo não existe \ n");
saída (1);

senão
sfile (buffer);

livre (tampão);
return 0;

void sfile (char const filename [])
struct stat sfile;
if (stat (filename, & sfile) == - 1)
printf ("Ocorreu um erro \ n");

// Acessando membros de dados de stat struct
printf ("\ nArquivo st_uid% d \ n", sfile.st_uid);
printf ("\ nArquivo st_blksize% ld \ n", sfile.st_blksize);
printf ("\ nArquivo st_gid% d \ n", sfile.st_gid);
printf ("\ nArquivo st_blocks% ld \ n", sfile.st_blocks);
printf ("\ nArquivo st_size% ld \ n", sfile.st_size);
printf ("\ nFile st_nlink% u \ n", (unsigned int) sfile.st_nlink);
printf ("\ nUsuário de permissões de arquivo \ n");
printf ((sfile.st_mode & S_IRUSR)? "r": "-");
printf ((sfile.st_mode & S_IWUSR)? "C":"-");
printf ((sfile.st_mode & S_IXUSR)? "x": "-");
printf ("\ n");
printf ("\ nGrupo de permissões de arquivo \ n");
printf ((sfile.st_mode & S_IRGRP)? "r": "-");
printf ((sfile.st_mode & S_IWGRP)? "C":"-");
printf ((sfile.st_mode & S_IXGRP)? "x": "-");
printf ("\ n");
printf ("\ nPermissões de arquivo outras \ n");
printf ((sfile.st_mode & S_IROTH)? "r": "-");
printf ((sfile.st_mode & S_IWOTH)? "C":"-");
printf ((sfile.st_mode & S_IXOTH)? "x": "-");
printf ("\ n");

RESULTADO:

No código C acima, inserimos o nome do arquivo e se o arquivo não existir, a execução do programa será interrompida. Isso é demonstrado na seguinte imagem:

Se nosso arquivo existe, a função sfile (n) será chamada na qual passamos o nome do arquivo. Dentro da função, em primeiro lugar usamos a chamada de sistema Stat, se stat () retornar -1 então deve haver algum erro para que uma mensagem seja impressa e a execução do programa seja interrompida.

Então, na instrução printf, usamos o nome da função e o separador de pontos para acessar os membros de dados de estrutura estatística.

Então, para o modo de arquivo, acessamos as macros ou sinalizadores de st_mode. Aqui lógico e operador são usados ​​para imprimir os respectivos modos. Verificamos as permissões de usuário, grupo e outros para o arquivo especificado (nome do arquivo inserido pelo usuário).

Com isso, você pode ver como usar a chamada de sistema stat da linguagem de programação C para obter informações do kernel do sistema operacional sobre os arquivos.  Se você tiver uma pergunta, não hesite em nos dizer através da seção de comentários.

Melhores distros Linux para jogos em 2021
O sistema operacional Linux percorreu um longo caminho desde sua aparência original, simples e baseada em servidor. Este sistema operacional melhorou ...
Como capturar e transmitir sua sessão de jogo no Linux
No passado, jogar era considerado apenas um hobby, mas com o tempo a indústria de jogos viu um grande crescimento em termos de tecnologia e número de ...
Melhores jogos para jogar com rastreamento manual
Oculus Quest introduziu recentemente a grande ideia de rastreamento manual sem controladores. Com um número cada vez maior de jogos e atividades que e...