Stat Sistem Çağrısı Linux Eğitimi

Stat System Call Linux Tutorial



Linux çekirdeği tarafından sağlanan sistem çağrıları, glibc aracılığıyla C programlama dilinde sunulur. Bir sistem çağrısı kullanıldığında, işletim sistemiyle iletişim kurarsınız ve dönüşte işletim sistemi sizinle sistem çağrısı işlevlerine döndürülen parametreler (dönüş değerleri) aracılığıyla iletişim kurar.

İstatistik Sistemi Çağrısı:

Stat sistem çağrısı, dosyaya ne zaman erişildiğini kontrol etmek gibi bir dosyanın durumunu kontrol etmek için Linux'ta bir sistem çağrısıdır. stat() sistem çağrısı aslında dosya özniteliklerini döndürür. Bir düğümün dosya öznitelikleri temel olarak Stat() işlevi tarafından döndürülür. Bir düğüm, dosyanın meta verilerini içerir. Bir düğüm şunları içerir: dosyanın türü, dosyanın boyutu, dosyaya ne zaman erişildiği (değiştirildiği, silindiği), yani zaman damgaları ve dosyanın yolu, kullanıcı kimliği ve grup kimliği, dosyanın bağlantıları , ve dosya içeriğinin fiziksel adresi.







İnode'un stat() sistem çağrısı için gerekli tüm verileri içerdiğini ve inode tablosuna kaydedilen dosyanın indeks numarası olduğunu söyleyebiliriz. Bir dosya oluşturduğunuzda, o dosya için bir düğüm numarası oluşturulur. İstatistik sistem çağrısını kullanarak sistem tabloları görüntülenebilir.



C Stat sistem çağrısının sözdizimi:

C programlama dilinde stat sistem çağrısını kullanmak için aşağıdaki başlık dosyasını eklemeniz gerekir:



#Dahil etmek

Stat, bir dosyanın durumunu almak için kullanılır. C stat sistem çağrısının sözdizimi her işletim sistemi için aynı olmayabilir. Linux'ta stat sistem çağrısının sözdizimi aşağıdaki gibidir:





intdurum(const karakter *yol, yapıdurum*meraklı)

Fonksiyonun int'deki dönüş tipi, eğer fonksiyon başarılı bir şekilde yürütülürse, herhangi bir hata varsa 0, -1 döndürülür.

Buraya const karakter *yol dosyanın adını belirtir. Dosya yolu sembolik bir bağlantıysa, dosya adı yerine bağlantıyı belirtmeniz gerekir.



Daha sonra fonksiyonda, adında bir işaretçi kullanan dosya hakkındaki verilerin veya bilgilerin depolandığı bir stat yapısına sahibiz. tutku, parametre olarak girilen ve çağrının yürütülmesi sırasında doldurulan ve çağrıdan sonra kullanıcı tarafından okunabilen.

Durum yapısı:

Başlık dosyasında tanımlanan stat yapısı aşağıdaki alanları içerir:

yapıdurum
{
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;
yapızaman belirtimi st_atim;
yapızaman belirtimi st_mtim;
yapızaman belirtimi st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
};

Açıklama:

  1. st_dev: Şu anda dosyamızın bulunduğu cihazın kimliğidir.
  2. st_rdev: Bu alan, belirli bir dosyanın belirli bir cihazı temsil ettiğini açıklar.
  3. st_ino: Dosyanın inode numarası veya seri numarasıdır. Bir indeks numarası olduğu için tüm dosyalar için benzersiz olmalıdır.
  4. st_size: st_size dosyanın bayt cinsinden boyutudur.
  5. st_atime: Dosyaya en son veya en son erişildiği zamandır.
  6. st_ctime: Dosyanın durumunun veya izinlerinin en son değiştirildiği zamandır.
  7. st_mtime: Dosyanın en son değiştirildiği zamandır.
  8. st_blksize: Bu alan, dosyadan dosyaya değişebilen G/Ç dosya sistemi için tercih edilen blok boyutunu verir.
  9. st_blocks: Bu alan, toplam blok sayısını 512 baytın katları olarak söyler.
  10. st_nlink: Bu alan toplam sabit bağlantı sayısını söyler.
  11. st_uid: Bu alan kullanıcı kimliğini gösterir.
  12. st_gid: Bu alan grup kimliğini gösterir.
  13. st_mode: Dosya üzerindeki izinleri belirtir, bir dosya üzerindeki kipleri söyler. st_mode alanı için tanımlanması gereken bayraklar şunlardır:
Bayraklar Açıklama Bayrak Değeri
S_IFMT Bir dosyanın mod değerini almak için kullanılan bir bit maskesi 0170000
S_IFSOCK Soketin bir dosya sabiti 0140000
S_IFLINK Sembolik bağlantının bir dosya sabiti 010000
S_IFREG Normal dosya için dosya sabiti 0100000
S_IFBLK Blok dosyası için dosya sabiti 0060000
S_IFDIR Dizin dosyası için dosya sabiti 0040000
S_IFCHR Karakter dosyası için dosya sabiti 0020000
S_IFIFO Bir dosya sabiti fifo 0010000
S_ISUID Kullanıcı Kimliği bitini ayarla 0004000
S_ISGID Grup Kimliği bitini ayarla 0002000
S_ISVTX Paylaşılan metni gösteren yapışkan bit 0001000
S_IRWXU Sahip İzinleri (okuma, yazma, yürütme) 00700
S_IRUSR Sahibi için İzinleri Oku 00400
S_IWUSR Sahip için İzinler Yaz 00200
S_IXUSR Sahibi için Yürütme İzinleri 00100
S_IRWXG Grup İzinleri (okuma, yazma, yürütme) 00070
S_IRGRP Grup için İzinleri Oku 00040
S_IWGRP Grup için Yazma İzinleri 00020
S_IXGRP Grup için Yürütme İzinleri 00010
S_IRWXO Başkaları için izinler (okuma, yazma, yürütme) 00007
S_IROTH Başkaları için İzinleri Oku 00004
S_IWOTH Başkaları için Yazma İzinleri 00002
S_IXOTH Başkaları için Yürütme İzinleri 00001

Stat sistem çağrısı nasıl kullanılır:

Aşağıdaki örnek, Linux, Ubuntu'da C programlama dilinde stat sistem çağrısının nasıl kullanılacağını gösterir.

ÖRNEK 1:

Aşağıdaki kodda bir dosyanın modunu bulacağız:

KOD:

#Dahil etmek
#Dahil etmek
intana()
{
// stat yapısına işaretçi
yapıdevlet dosyası;

// sistem çağrısını stat
durum('stat.c', &sfile);

//st_mode'a erişim (stat yapısının veri üyesi)
baskı ('st_mode = %o',sfile.st_mode);
dönüş 0;
}

Programın derlenmesi ve çalıştırılması aşağıdaki gibi döner:

Bu kodda, stat sistem çağrısında dosyanın adını ve ardından işaretçiyi sfile olan stat yapısına geçtik. stat struct işaretçisi daha sonra printf deyimini kullanarak dosyanın modunu görüntüleyen st_mode'a erişmek için kullanılır.

Başlık dosyası, stat sistem çağrısını kullanabilmeniz için kullanılır. Başlık dosyası, C kodunuzda printf veya scanf kullanabilmeniz için standart girdi/çıktı kitaplığı dosyasıdır.

ÖRNEK 2:

Aşağıdaki kodda, stat sistem çağrısını kullanarak dosya hakkında bilgi alacağız:

KOD:

#Dahil etmek
#Dahil etmek
#Dahil etmek
#Dahil etmek

geçersizsfile(karakter constdosya adı[]);

intana(){
ssize_t okuma;
karakter*tampon= 0;
size_tbuf_size= 0;

baskı ('Kontrol edilecek bir dosyanın adını girin: ');
okuman=hat almak(&tampon, &buf_size,standart);

Eğer (okuman<=0 ){
baskı ('getline başarısız oldu ');
çıkış (1);
}

Eğer (tampon[okuman-1] == ' '){
tampon[okuman-1] = 0;
}

ints=açık(tampon,O_RDONLY);
Eğer(s== -1){
baskı ('Dosya mevcut değil ');
çıkış (1);
}
Başka{
sfile(tampon);
}
Bedava (tampon);
dönüş 0;
}

geçersizsfile(karakter constdosya adı[]){

yapıdevlet dosyası;

Eğer(durum(dosya adı, &sfile)== -1){
baskı ('Hata oluştu ');
}

// stat yapısının veri üyelerine erişim
baskı (' Dosya st_uid %d ',sfile.st_uid);
baskı (' Dosya st_blksize %ld ',sfile.st_blksize);
baskı (' Dosya st_gid %d ',sfile.st_gid);
baskı (' Dosya st_blocks %ld ',sfile.st_blocks);
baskı (' Dosya st_size %ld ',sfile.st_size);
baskı (' Dosya st_nlink% u ',(imzasız int)sfile.st_nlink);
baskı (' Dosya İzinleri Kullanıcısı ');
baskı ((sfile.st_mode &S_IRUSR)? 'r':'-');
baskı ((sfile.st_mode &S_IWUSR)? 'içinde':'-');
baskı ((sfile.st_mode &S_IXUSR)? 'x':'-');
baskı (' ');
baskı (' Dosya İzinleri Grubu ');
baskı ((sfile.st_mode &S_IRGRP)? 'r':'-');
baskı ((sfile.st_mode &S_IWGRP)? 'içinde':'-');
baskı ((sfile.st_mode &S_IXGRP)? 'x':'-');
baskı (' ');
baskı (' Dosya İzinleri Diğer ');
baskı ((sfile.st_mode &S_IROTH)? 'r':'-');
baskı ((sfile.st_mode &S_IWOTH)? 'içinde':'-');
baskı ((sfile.st_mode &S_IXOTH)? 'x':'-');
baskı (' ');
}

ÇIKTI:

Yukarıdaki C kodunda dosyanın adını girdik ve dosya yoksa programın çalışması durdurulacaktır. Bu, aşağıdaki resimde gösterilmiştir:

Eğer dosyamız varsa, dosyanın adını ilettiğimiz sfile(n) işlevi çağrılır. Fonksiyon içinde öncelikle Stat sistem çağrısını kullandık, eğer stat() -1 döndürürse herhangi bir hata olması gerekir, böylece bir mesaj yazdırılacak ve programın yürütülmesi durdurulacaktır.

Daha sonra printf deyiminde, veri üyelerine erişmek için işlevin adını ve nokta ayırıcıyı kullandık. stat yapısı .

Daha sonra dosya modu için st_mode'un makrolarına veya bayraklarına eriştik. Burada mantıksal ve operatör, ilgili modları yazdırmak için kullanılır. Belirtilen dosya (kullanıcı tarafından girilen dosya adı) için kullanıcı, grup ve diğerleri için izinleri kontrol ettik.

Bununla, işletim sistemi çekirdeğinden dosyalar hakkında bilgi almak için C programlama dilinden stat sistem çağrısını nasıl kullanacağınızı görebilirsiniz. Bir sorunuz varsa, yorum bölümünden bize bildirmekten çekinmeyin.