Tutorial do Stat System Call Linux

Stat System Call Linux Tutorial



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:

Chamada de sistema stat é uma chamada de sistema no Linux para verificar o status de um arquivo, por exemplo, para verificar quando o arquivo foi acessado. A chamada de sistema stat () realmente retorna atributos de 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 de 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 necessários para a chamada do sistema stat () e é o número do índice do 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:





intEstado(const Caracteres *caminho, estruturaEstado*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ê precisará especificar o link em vez do nome do arquivo.



Então, na função, temos uma estrutura estatística na qual os dados ou informações sobre o arquivo são armazenados, a qual 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 no arquivo de cabeçalho contém os seguintes campos:

estruturaEstado
{
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_tst_size;
estruturatimspec st_atim;
estruturatimspec st_mtim;
estruturatimspec 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 de E / S, 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
inta Principal()
{
// ponteiro para stat struct
estruturaarquivo de estado;

// chamada do sistema stat
Estado('stat.c', Esfile);

// acessando st_mode (membro de dados da estrutura estatística)
printf ('st_mode =% o',sfile.st_mode);
Retorna 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 exibe o modo do arquivo usando a instrução printf.

O arquivo de cabeçalho é usado para que você possa usar a chamada de sistema stat. 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

vaziosfile(Caracteres constnome do arquivo[]);

inta Principal(){
ssize_t lido;
Caracteres*amortecedor= 0;
size_tbuf_size= 0;

printf ('Digite o nome de um arquivo para verificar: n');
leitura=Obter linha(Eamortecedor, Ebuf_size,Stdin);

E se (leitura<=0 ){
printf ('getline falhou n');
saída (1);
}

E se (amortecedor[leitura-1] == ' n'){
amortecedor[leitura-1] = 0;
}

ints=abrir(amortecedor,O_RDONLY);
E se(s== -1){
printf ('Arquivo não existe n');
saída (1);
}
outro{
sfile(amortecedor);
}
gratuitamente (amortecedor);
Retorna 0;
}

vaziosfile(Caracteres constnome do arquivo[]){

estruturaarquivo de estado;

E se(Estado(nome do arquivo, &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 (' nArquivo st_nlink% u n',(não assinado int)sfile.st_nlink);
printf (' nUsuário de permissões de arquivo n');
printf ((sfile.st_mode ES_IRUSR)? 'r':'-');
printf ((sfile.st_mode ES_IWUSR)? 'no':'-');
printf ((sfile.st_mode ES_IXUSR)? 'x':'-');
printf (' n');
printf (' nGrupo de permissões de arquivo n');
printf ((sfile.st_mode ES_IRGRP)? 'r':'-');
printf ((sfile.st_mode ES_IWGRP)? 'no':'-');
printf ((sfile.st_mode ES_IXGRP)? 'x':'-');
printf (' n');
printf (' nOutras permissões de arquivo n');
printf ((sfile.st_mode ES_IROTH)? 'r':'-');
printf ((sfile.st_mode ES_IWOTH)? 'no':'-');
printf ((sfile.st_mode ES_IXOTH)? 'x':'-');
printf (' n');
}

SAÍDA:

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.