"Enter"a basıp içeriğe geçin

Stat Sistem Çağrısı Linux Eğitimi – Linux Önerileri

Linux çekirdeği tarafından sağlanan sistem çağrıları, glibc aracılığıyla C’ye tanıtılır. Bir sistem çağrısı kullandığınızda, işletim sistemi ile iletişim kurarsınız ve dönüş üzerine işletim sistemi, sistem çağrısı işlevlerine döndürülen parametreler (dönüş değerleri) aracılığıyla sizinle iletişim kurar.

Sistem çağrısı istatistikleri:

Platform çağrısı, dosyaya ne zaman erişildiği gibi bir dosyanın durumunu kontrol etmek için Linux’ta yapılan bir sistem çağrısıdır. Sistem çağrısı stat() aslında dosyanın özniteliklerini döndürür. Düğüm dosyasının öznitelikleri esas olarak stat() işlevi tarafından döndürülür. Düğüm, dosyanın meta verilerini içerir. Düğüm şunları içerir: dosya türü, dosya boyutu, dosyaya erişim zamanı (değiştirilmiş, silinmiş), yani zaman damgaları ve dosyanın yolu, kullanıcı kimliği ve grup kimliği, dosyaya bağlantılar, dosya içeriğinin fiziksel adresi.

İnode, inode tablosunda tutulan dosyanın indeks numarası olan stat() sistem çağrısı için gerekli tüm verileri içerir diyebiliriz. Bir dosya oluşturulduğunda, o dosya için bir düğüm numarası oluşturulur. Sistem tabloları, istatistik sistem çağrısı kullanılarak görüntülenebilir.

C Stat sistemini çağırmanın sözdizimi şöyledir:

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

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

int durum(Sabit miktarMektup*yolVeyapı durum *Meraklı)

İş türünün dönüşü intFonksiyon başarıyla yürütülürse, herhangi bir hata varsa 0, -1 döndürür.

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

Daha sonra fonksiyonda a basit yapı Dosyayla ilgili veri veya bilgilerin, adı verilen bir işaretçi kullanılarak saklandığı yer Meraklı Parametre olarak girilir ve aramanın yürütülmesi sırasında doldurulur ve aramadan sonra kullanıcı tarafından okunabilir.

Devlet Yapısı:

Belirtilen ana yapı başlık dosyası aşağıdaki alanları içerir:

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

Tanılama:

  1. st_dev: Dosyamızın şu anda bulunduğu cihaz tanımlayıcısıdır.
  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ı. Bir dizin numarası olduğu için tüm dosyalar için benzersiz olmalıdır.
  4. st_size: st_size, bayt cinsinden dosya boyutudur.
  5. st_atime: Dosyaya en son ne zaman erişildi veya erişildi.
  6. st_ctime: Dosyanın durumunun veya izinlerinin en son değiştirildiği zaman.
  7. st_mtime: Dosyanın son değiştirilme zamanı.
  8. st_blacksize: Bu alan, G/Ç dosya sistemi için dosyadan dosyaya değişebilen tercih edilen blok boyutunu verir.
  9. st_blocks: Bu alan, toplam blok sayısını 512 baytın katları halinde söyler.
  10. st_nlink: Bu alan, sabit bağlantıların toplam sayısını gösterir.
  11. st_uid: Bu alan, kullanıcı kimliğini görüntüler.
  12. st_gid: Bu alan grup kimliğini görüntüler.
  13. st_mode: Dosyadaki izinleri ayarlar ve dosyadaki modları söyler. st_mode alanı için belirtilmesi gereken bayraklar şunlardır:
Bayraklar Tanılama etiket değeri
S_IFMT Dosyanın değiştirilmiş değerini almak için kullanılan bir bit maskesi 0170000
S_IFSOCK Soket sabit dosya 0140000
S_IFLINK Sembolik bağlantı için sabit dosya 0120000
S_IFREG Normal dosya için sabit dosya 0100000
S_IFBLK Blok dosyası için sabit dosya 0060000
S_IFDIR dizin dosyası için dosya sabiti 0040000
S_IFCHR Profil için sabit dosya 0020000
S_IFO Sabit fifo dosyası 0010000
S_ISUID Kullanıcı kimliği bitini ayarlayın 0004000
S_ISGID Grup tanımlayıcı bitini ayarlayın 0002000
S_ISVTX Paylaşılan metni görüntüleyen yapışkan bir bit 0001000
S_IRWXU sahip izinleri (okuma, yazma, yürütme) 00700
S_IRUSR Sahip izinlerini oku 00400
S_IWUSR Sahibi için yazma izinleri 00200
S_IXUSR Sahip için yürütme izinleri 00100
S_IRWXG grup izinleri (okuma, yazma, yürütme) 00070
S_IRGRP Grup izinlerini oku 00040
S_IWGRP Grup için izinleri yazın 00020
S_IXGRP Grup izinlerini yürütün 00010
S_IRWXO Başkalarına verilen izinler (okuma, yazma, yürütme) 00007
S_IROTH Diğerleri için okuma izinleri 00004
S_IWOTH Başkaları için yazma izinleri 00002
S_IXOTH Başkaları için yürütme izinleri 00001

Platform çağrısı nasıl kullanılır:

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

Örnek 1:

Aşağıdaki kodda dosya modunu bulacağız:

kod:

#birleştirmek için
#birleştirmek için
int o()
{
// İstatistik yapısına bir işaretçi
yapı İstatistik dosyası;
// sistem çağrı platformu
durum(“stat.c”Ve&dosya);
// st_mode’a erişim (stat yapısının veri üyesi)
Baskı(“st_mode = %o”Ve dosyast_mode);
dönüş0;
}

Programı aşağıdaki gibi derleyin ve çalıştırın:

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

Başlık dosyası, platform çağrısını kullanabilmeniz için kullanılır. ana dosya Standart bir G/Ç kitaplığı dosyasıdır, böylece C kodunda printf veya scanf kullanabilirsiniz.

Örnek 2:

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

kod:

#birleştirmek için
#birleştirmek için
#birleştirmek için
#birleştirmek için
Geçersiz dosya(MektupSabit miktar dosya adı[]);
int o(){
ssize_t’yi oku;
Mektup* tampon =0;
size_t buf_size =0;
Baskı(Kontrol edilecek dosyanın adını girin: \n);
Okuman = Doğrultusunda olsun(&tamponVe&buf_sizeVe Temel);
eğer(Okuman <=0){
Baskı(Hat alınamadı\n);
çıkış(1);
}
eğer(tampon[okuman1]==\n){
tampon[okuman1]=0;
}
int s=(tamponVeSADECE O_RD);
eğer(s== –1){
Baskı(“Dosya yok\n);
çıkış(1);
}
diğer{
dosya(tampon);
}
Bedava(tampon);
dönüş0;
}
Geçersiz dosya(MektupSabit miktar dosya adı[]){
yapı İstatistik dosyası;
eğer(durum(dosya adıVe &dosya)== –1){
Baskı(“bir hata oluştu\n);
}
// Altta yatan yapının veri üyelerine erişin
Baskı(\nDosya st_uid%d \nVedosyast_uid);
Baskı(\nst_blksize%ld dosyası \nVedosyast_blacksize);
Baskı(\nDosya st_gid%d \nVedosyast_gid);
Baskı(\nDosya st_blocks%ld \nVedosyast_blocks);
Baskı(\nDosya st_size%ld \nVedosyast_size);
Baskı(\nDosya st_nlink%u \nVe(imzasızint)dosyast_nlink);
Baskı(\nDosya izinleri kullanıcısı\n);
Baskı((dosyast_mode& S_IRUSR)?“s”:“-“);
Baskı((dosyast_mode& S_IWUSR)?“w”:“-“);
Baskı((dosyast_mode& S_IXUSR)?“x”:“-“);
Baskı(\n);
Baskı(\nDosya izinlerini ayarla\n);
Baskı((dosyast_mode& S_IRGRP)?“s”:“-“);
Baskı((dosyast_mode& S_IWGRP)?“w”:“-“);
Baskı((dosyast_mode& S_IXGRP)?“x”:“-“);
Baskı(\n);
Baskı(\nDiğer dosya izinleri\n);
Baskı((dosyast_mode& S_IROTH)?“s”:“-“);
Baskı((dosyast_mode& S_IWOTH)?“w”:“-“);
Baskı((dosyast_mode& S_IXOTH)?“x”:“-“);
Baskı(\n);
}

Üretmek:

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

Dosyaya sahipsek, dosya adını girdiğimiz sfile(n) işlevi çağrılır. İşlev içinde öncelikle Stat sistem çağrısını kullandık, eğer stat() -1 döndürürse hata olmamalıdır, bu nedenle bir mesaj yazdırılacak ve programın çalışması durdurulacaktır.

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

Ardından, st_mode makrolarına veya dosya modu bayraklarına geçiyoruz. Burada mantık 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ğer 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ı öğrenebilirsiniz. Bir sorunuz varsa, yorumlar bölümünde bize söylemekten çekinmeyin.

Diğer gönderilerimize göz at

[wpcin-random-posts]

İlk Yorumu Siz Yapın

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir