C'de memory alanlarının kopyalanması

11:37
Aşağıda anlatacağım C fonksiyonları bir memory bloğundaki verileri başka bir memory bloğuna kopyalamak için kullanılmaktadır.

memcpy:

memcpy bir memory bloğundaki bilgiyi diğer memory bloğuna fonksiyona geçirilen 3. parametrede geçen değer kadar byte kopyalaması yapar. memory overlap sorununa karşı korumasız durumdadır. Yani source ve destination memory alanlarında üst üste gelme durumu varsa fonksiyon istenilen çıktıları üretememektedir.


Aşağıda örnek bir kod ve çalışması görülmektedir.



 Aşağıda 24 byte kopyalama yapılmıştır. Böylece Null karakter kopyalaması da ptrDest dizisine kopyalanmıştır.





memccpy:

memccpy memcpy ile benzer çalışmakta 3. ve 4. parametreler  ise 3. parametrede karakter olarak gönderilen değerle karşılaşıncaya kadar kopyalama yapar bulamazsa 4. parametre verilen boyuta kadar kopyalama yapar.


  Aşağıdaki örnekte B harfini gönderene kadar ya da maksimum 24 byte kopyalama yapar.



mempcpy:

mempcpy fonksiyonu memcpy ile benzer çalışmakta yalnızca geri dönüş değeri olarak kopyalama işlemi yaptıktan sonra (hedef alana) bir sonraki adresi geri dönüş olarak verir. Bu fonksiyon daha çok birden fazla hafıza alanından birleştirme yaparken kullanılır.


 Örnek bir kullanım aşağıdaki gibidir:





memmove:

memmove memcpy ile benzer yapıdadır. Fakat memory overlap'e karşı önce kaynağı temp bir alana kopyalar ardından hedef olarak verilen yere temp alandan kopyalama yapar. Daha güvenli bir kopyalama sağlar ama memcpy 'ye göre daha yavaştır.


 Örnek bir memmove kullanımı aşağıdaki gibidir:




 Aşağıda memory overlap durumuna bir örnek verilmiştir.





strcpy:

strcpy fonksiyonu ise hedef ve kaynak parametrelerini alır hedefte verilen string'i null karakter görene kadar hedef alana kopyalamaya çalışır. Ya da üçüncü parametre olarak verilen byte kadar kopyalama yapar. Eğer verilen uzunluk dahilinde string içinde Null karakter yoksa kopyalama sonrası hedef alanda sonunda null karakter olmayan bir string olacaktır.


string kopyalama işlemlerinde daha çok strcpy fonksiyonu kullanılmaktadır. Örnek bir uygulama aşağıdaki gibidir:







bcopy:

deprecated olmuş bir fonksiyondur. memcpy ile benze çalışmaktadır. Memory overlap durumuna karşı korumalıdır.


 Örnek bir uygulama:





cURL kütüphanesinin C'de Kullanımı

10:46 ,


Derlediğimiz lib dosyasını projemize dahil etmek için yapmamız gereken bazı ayarlamalar vardır. ilk önce yapılması gereken preprocessor definition kısmına BUILDING_LIBCURL tanımlamasının girilmesi gerekmektedir.





Ardından Additional Dependencies kısmına ise libcurl.lib,ws2_32.lib,wldap32.lib kütüphanelerinin girilmesi gerekmektedir.




.lib dosyamızın yeri de projemize gösterilmesi gerekir.







Preprocessor'ün ihtiyacı olan başlık dosyalarının yerinin de gösterilmesinin ardından cURL artık kullanılmaya hazır hale gelmiştir.




Eğer bu noktada linker hatası aldıysanız problemin 32 Bit - 64 Bit farkı olma olasılığı yüksektir.





Çünkü biz kütüphanemizi 32 Bitte derlemiş olabiliriz.(öyle yaptık)


Bu noktada yapılması gereken şey libcurl projesini 64 Bitte derlemek olacaktır. Ardından .lib dosyasını eskisiyle değiştirilmesinin ardından projemiz başarıyla çalışacaktır.









Bu noktada projemizi 32 Bit'e çeksek bu sefer yine linker hatası verecektir. Çünkü libcurl'ü 64 Bitte derledik.











cURL kütüphanesinin C Projesine dahil edilmesi

10:50 ,




cURL kütüphanesi C ile http gibi web isteklerini gerçekleştirmek için kullanılan bir kütüphanedir. Öncelikle yapılamsı gereken web sitesinden ( http://curl.haxx.se/ ) ilgili dosya indirilir.




ve dosya içeriğindeki vs-> vc8 -> lib içindeki visual studio proje kısayolu ile libcurl projesi açılır. 


Projenin çıktısı .lib dosyası olacaktır. Derleme işleminin ardından .lib dosyamızın oluştuğu görülecektir. 



Projeyi derlemeden önce aditional include library kısmına projenin ihtiyacı olan dosyaların yerlerinin düzgün verildiğine dikkat ediniz. 



Ardından projeyi build ettiğinizde projenin derlendiğini göreceksiniz. Burda dikkat edilmesi gereken parametreler 32 Bit - 64 Bit ve Debug -Release Mod seçenekleri olacaktır.

Umask Fonksiyonu


umask user mask  kelimelerinden türetilmiştir. Dosya oluştururken hangi haklarla oluşturulacağını ayarlayan C POSIX fonksiyonudur. Kısaca fonksiyon 0777 ile mask değerini logical and (&) işlemine sokar.



umask(0) demek oluşturulan dosya tüm gruplar için  rwx haklarına sahip olacağını ( u=rwx, g=rwx, o=rwx ) umask(777) ile ise hiçbir hakka ( u=, g=, o= ) sahip olunmayacağını belirtir.



Aşağıda görüldüğü gibi umask değerinin değiştirmezsek user için rwx diğerleri için hiçbir hakka sahip olmadan oluşturduğu gözükür.


Bu işlemin benzerlerinin shell üzerinden de aşağıdaki şekilde yapılabilir.



umask -S ile oluşturulacak dosyaların hangi haklarla oluşturulacağını u(ser), g(roup), o(ther) belirtir.

C'de gets fonksiyonunun implementasyonu

10:44

Standart gets fonksiyonu EOF veya new line("\n") karakteri görene kadar stdin dosyasından okuma yapar ve bu okunan iki karakterden gelen herhangi birinin yerine "\0" karakteri  ile yer değiştirir. gets fonksiyonu parametre olarak aldığı char * adresinden başlayarak içini doldurur ve başlangıç adresini geri dönüş değeri olarak verir. gets fonksiyonunu getchar kullanılarak yazmak mümkündür.Biz bu implementasyonu yaparak gets fonksiyonunu daha iyi anlamış oluruz. ( getchar fonksiyonu stdin'inden tek bir karakter okuma işlemi yapar. )


Yukarıdaki mygetsv1 versiyonunda while döngüsü ile tek tek karakter okuması yapar ve gelen karakter new line veya EOF karakteri ise döngüden çıkmaktadır.  "\n" ve EOF karakterlerine okuma yapar yani stdin' den alır ama bunları diziye koymaz onun yerine "\0" yani null karakter yerleştirmektedir.

Eğer diziye hiç atama yapılmamış ve gelen karakter EOF ise NULL geri dönüş yapmaktadır aksi halde üzerinde işlem yapılan dizinin başlangıç adresini geri döndürür.



mygetsv2'de ise aynı algoritma for döngüsüyle implemente edilmiştir.



main fonksiyonu ise mygets fonksiyonlarının geri dönüş değeri NULL olana kadar okuma yapar ve ekrana bastırır. Fonksiyonun çalıştırırsak aşağıdaki gibi düzgün çalıştığı görülebilir.



C'de opendir-readdir-closedir Fonksiyonları



  • opendir: Dosya açma
  • readdir: Dosya okuma
  • closedir: Dosya kapama


Öncelikler Linux sistemlerde (Sistem programlamada) dosya kavramı normal dosyalar ve dizinleri de içerecek şekilde kullanılmaktadır. Basit bir klasör listeleme programı aşağıdaki gibi yazılacaktır:



opendir ile dosya açılır ardından readdir ile içinde bulunan dosyalar okunur.


readdir fonksiyonunun geri dönüş değeri struct dirent pointer türündendir. 


Dosyaları listelemede filtreleme yapmak istersek aşağıdaki örnekten faydalanılabilir.


Dosyaların isimlerine ve diğer bilgilerine ent->d_name ile ulaşılır. struct dirent içinde başka bir çok bilgi bulunmaktadır. istediğimiz bilgileri ekrana yazdırabiliriz.

Bizim programın çıktısı aşağıdaki gibi olmuştur:



Sistemdeki Sürücüleri Listeleme

05:45

Windows işletim sisteminde C programlama dili kullanılarak nasıl sisteme takılı olan sürücüleri elde edebiliriz? Bu sorunun çözümü windowsta bulunan GetLogicalDriveStrings fonksiyonunu kullanmaktır. Bu fonksiyonun nasıl kullanılacağı aşağıdaki gibidir: